#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];
inline lli c2(lli x)
{
return ((x*(x-1ll)))%MOD;
}
lli DP(lli idx, lli chains, lli start, lli end)
{
if(idx == n) return (!start && !end && !chains);
if(idx > cs && !start) return 0;
if(idx > cf && !end) return 0;
else if(memo[idx][chains] != -1) return memo[idx][chains]%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] = 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] = 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] = 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++)
{
memo[i][j] = -1;
}
}
printf("%lld\n", DP(0, 0, 0, 0)%MOD);
}
Compilation message
kangaroo.cpp: In function 'int main()':
kangaroo.cpp:91: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 |
33424 KB |
Output is correct |
2 |
Correct |
0 ms |
33424 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
33424 KB |
Output is correct |
2 |
Correct |
0 ms |
33424 KB |
Output is correct |
3 |
Correct |
0 ms |
33424 KB |
Output is correct |
4 |
Correct |
0 ms |
33424 KB |
Output is correct |
5 |
Correct |
0 ms |
33424 KB |
Output is correct |
6 |
Correct |
0 ms |
33424 KB |
Output is correct |
7 |
Correct |
0 ms |
33424 KB |
Output is correct |
8 |
Correct |
0 ms |
33424 KB |
Output is correct |
9 |
Correct |
0 ms |
33424 KB |
Output is correct |
10 |
Correct |
0 ms |
33424 KB |
Output is correct |
11 |
Correct |
0 ms |
33424 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
33424 KB |
Output is correct |
2 |
Correct |
0 ms |
33424 KB |
Output is correct |
3 |
Correct |
0 ms |
33424 KB |
Output is correct |
4 |
Correct |
0 ms |
33424 KB |
Output is correct |
5 |
Correct |
0 ms |
33424 KB |
Output is correct |
6 |
Correct |
0 ms |
33424 KB |
Output is correct |
7 |
Correct |
0 ms |
33424 KB |
Output is correct |
8 |
Correct |
0 ms |
33424 KB |
Output is correct |
9 |
Correct |
0 ms |
33424 KB |
Output is correct |
10 |
Correct |
0 ms |
33424 KB |
Output is correct |
11 |
Correct |
0 ms |
33424 KB |
Output is correct |
12 |
Correct |
0 ms |
33424 KB |
Output is correct |
13 |
Correct |
0 ms |
33424 KB |
Output is correct |
14 |
Correct |
0 ms |
33424 KB |
Output is correct |
15 |
Correct |
0 ms |
33424 KB |
Output is correct |
16 |
Correct |
0 ms |
33424 KB |
Output is correct |
17 |
Correct |
0 ms |
33424 KB |
Output is correct |
18 |
Correct |
0 ms |
33424 KB |
Output is correct |
19 |
Correct |
0 ms |
33424 KB |
Output is correct |
20 |
Correct |
0 ms |
33424 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
33424 KB |
Output is correct |
2 |
Correct |
0 ms |
33424 KB |
Output is correct |
3 |
Correct |
0 ms |
33424 KB |
Output is correct |
4 |
Correct |
0 ms |
33424 KB |
Output is correct |
5 |
Correct |
0 ms |
33424 KB |
Output is correct |
6 |
Correct |
0 ms |
33424 KB |
Output is correct |
7 |
Correct |
0 ms |
33424 KB |
Output is correct |
8 |
Correct |
0 ms |
33424 KB |
Output is correct |
9 |
Correct |
0 ms |
33424 KB |
Output is correct |
10 |
Correct |
0 ms |
33424 KB |
Output is correct |
11 |
Correct |
0 ms |
33424 KB |
Output is correct |
12 |
Correct |
0 ms |
33424 KB |
Output is correct |
13 |
Correct |
0 ms |
33424 KB |
Output is correct |
14 |
Correct |
0 ms |
33424 KB |
Output is correct |
15 |
Correct |
0 ms |
33424 KB |
Output is correct |
16 |
Correct |
0 ms |
33424 KB |
Output is correct |
17 |
Correct |
0 ms |
33424 KB |
Output is correct |
18 |
Correct |
0 ms |
33424 KB |
Output is correct |
19 |
Correct |
0 ms |
33424 KB |
Output is correct |
20 |
Correct |
0 ms |
33424 KB |
Output is correct |
21 |
Correct |
13 ms |
33424 KB |
Output is correct |
22 |
Correct |
13 ms |
33424 KB |
Output is correct |
23 |
Correct |
13 ms |
33424 KB |
Output is correct |
24 |
Correct |
109 ms |
33456 KB |
Output is correct |
25 |
Correct |
106 ms |
33456 KB |
Output is correct |
26 |
Correct |
89 ms |
33456 KB |
Output is correct |
27 |
Correct |
156 ms |
33452 KB |
Output is correct |
28 |
Correct |
63 ms |
33424 KB |
Output is correct |