#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long int lli;
const lli maxn = lli(2e3)+5, MOD = lli(1e9)+7;
lli n, cs, cf, memo[maxn][maxn][2][2];
inline lli c2(lli x)
{
return (x*(x-1))%MOD/2ll;
}
lli DP(lli idx, lli chains, lli start, lli end)
{
if(idx == n) return (!start && !end && !chains);
else if(memo[idx][chains][start][end] != -1) return memo[idx][chains][start][end]%MOD;
else if(idx == cs)
{
lli res = DP(idx+1, chains, 1, end)%MOD;
if(chains)
{
res += chains*DP(idx+1, chains-1, 1, end)%MOD;
res %= MOD;
}
if(end)
{
res += DP(idx+1, chains, 0, 0)%MOD;
res %= MOD;
}
res %= MOD;
memo[idx][chains][start][end] = res;
//cout << idx << " " << chains << " " << start << " " << end << ": " << res << "\n";
return res;
}
else if(idx == cf)
{
lli res = DP(idx+1, chains, start, 1)%MOD;
if(chains)
{
res += chains*DP(idx+1, chains-1, start, 1)%MOD;
res %= MOD;
}
if(start)
{
res += DP(idx+1, chains, 0, 0)%MOD;
res %= MOD;
}
res %= MOD;
memo[idx][chains][start][end] = res;
//cout << idx << " " << chains << " " << start << " " << end << ": " << res << "\n";
return res;
}
else
{
lli res = DP(idx+1, chains+1, start, end)%MOD;
if(chains > 1)
{
res += c2(chains)*DP(idx+1, chains-1, start, end)%MOD;
res %= MOD;
}
if(start && chains)
{
res += chains*DP(idx+1, chains-1, start, end)%MOD;
res %= MOD;
}
if(chains && end)
{
res += chains*DP(idx+1, chains-1, start, end)%MOD;
res %= MOD;
}
if(start && end)
{
res += DP(idx+1, chains, start-1, end-1)%MOD;
res %= MOD;
}
res %= MOD;
memo[idx][chains][start][end] = res;
//cout << idx << " " << chains << " " << start << " " << end << ": " << res << "\n";
return res;
}
}
int main(void)
{
scanf("%lld%lld%lld", &n, &cs, &cf);
cs--, cf--;
for(lli i = 0;i <= n;i++)
{
for(lli j = 0;j <= n;j++)
{
for(lli k = 0;k < 2;k++)
{
for(lli l = 0;l < 2;l++) memo[i][j][k][l] = -1;
}
}
}
printf("%lld\n", DP(0, 0, 0, 0)%MOD);
}
Compilation message
kangaroo.cpp: In function 'int main()':
kangaroo.cpp:89:37: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld%lld%lld", &n, &cs, &cf);
^
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
127644 KB |
Output is correct |
2 |
Incorrect |
0 ms |
127644 KB |
Output isn't correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
127644 KB |
Output is correct |
2 |
Incorrect |
0 ms |
127644 KB |
Output isn't correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
127644 KB |
Output is correct |
2 |
Incorrect |
0 ms |
127644 KB |
Output isn't correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
127644 KB |
Output is correct |
2 |
Incorrect |
0 ms |
127644 KB |
Output isn't correct |