Submission #150921

#TimeUsernameProblemLanguageResultExecution timeMemory
150921Mamnoon_SiamKangaroo (CEOI16_kangaroo)C++17
36 / 100
5 ms3064 KiB
#include <bits/stdc++.h>
using namespace std;

const int mod = 1e9 + 7;
const int maxn = 55;

int n, cs, cf;
int dp[maxn][maxn][maxn][2];

int f(int l, int r, int t, int dir) {
	int &ret = dp[l][r][t][dir];
	if(ret != -1) return ret;
	if(l + r == 1) return ret = (l ^ 1) == dir;
	if((!dir and !l) or (dir and !r)) return ret = 0;
	ret = 0;
	if(!dir) {
		for(int i = 1; i <= l; i++) {
			if(i == t) continue;
			ret += f(i - 1, l + r - i, t - (i < t), dir ^ 1);
			if(ret >= mod) ret -= mod;
		}
	} else {
		for(int i = l + 1; i <= l + r; i++) {
			if(i == t) continue;
			ret += f(i - 1, l + r - i, t - (i < t), dir ^ 1);
			if(ret >= mod) ret -= mod;
		}
	} return ret;
}

int main(int argc, char const *argv[])
{
	// freopen("in", "r", stdin);
	memset(dp, -1, sizeof dp);
	cin >> n >> cs >> cf;
	int l = f(cs - 1, n - cs, cf - (cs < cf), 0);
	int r = f(cs - 1, n - cs, cf - (cs < cf), 1);
	cout << (l + r) % mod << endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...