Submission #24758

# Submission time Handle Problem Language Result Execution time Memory
24758 2017-06-13T03:25:21 Z nibnalin Kangaroo (CEOI16_kangaroo) C++14
0 / 100
0 ms 127644 KB
#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