제출 #645543

#제출 시각아이디문제언어결과실행 시간메모리
645543ymm캥거루 (CEOI16_kangaroo)C++17
100 / 100
32 ms31744 KiB
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

const int N = 2010;
const int mod = 1e9 + 7;
ll out_of_bound[32];
ll dp[N][N];

int main()
{
	cin.tie(0) -> sync_with_stdio(false);
	dp[0][0] = 1;
	int n, s, t;
	cin >> n;
	cin >> s >> t;
	if (s > t) swap(s, t);
	--s; --t;
	Loop (i,0,s) Loop (j,0,n) {
		dp[i+1][j+1] += dp[i][j];
		dp[i+1][j+1] %= mod;
		dp[i+1][j-1] += dp[i][j] * j * (j-1);
		dp[i+1][j-1] %= mod;
	}
	Loop (j,0,n) {
		dp[s+1][j+1] += dp[s][j];
		dp[s+1][j+1] %= mod;
		dp[s+1][j] += dp[s][j] * j;
		dp[s+1][j] %= mod;
	}
	Loop (i,s+1,t) Loop (j,1,n) {
		dp[i+1][j+1] += dp[i][j];
		dp[i+1][j+1] %= mod;
		dp[i+1][j-1] += dp[i][j] * (j-1) * (j-1);
		dp[i+1][j-1] %= mod;
	}
	if (t == n-1) {
		cout << dp[t][1] << '\n';
		return 0;
	}
	Loop (j,1,n) {
		dp[t+1][j+1] += dp[t][j];
		dp[t+1][j+1] %= mod;
		dp[t+1][j] += dp[t][j] * (j-1);
		dp[t+1][j] %= mod;
	}
	Loop (i,t+1,n-1) Loop (j,2,n) {
		dp[i+1][j+1] += dp[i][j];
		dp[i+1][j+1] %= mod;
		dp[i+1][j-1] += dp[i][j] * ((j-2) * (j-3) + (j-2) + (j-2));
		dp[i+1][j-1] %= mod;
	}
	//Loop (i,0,n) {
	//	cout << i << ": ";
	//	Loop (j,0,i+1)
	//		cout << dp[i][j] << ' ';
	//	cout << '\n';
	//}
	cout << dp[n-1][2] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...