Pagini recente » Cod sursa (job #2823800) | Cod sursa (job #1102972) | Cod sursa (job #1788337) | Cod sursa (job #2853728) | Cod sursa (job #2507112)
//check check check
#include<iostream>
#include<vector>
#include<algorithm>
#include<fstream>
#include<queue>
#include<cstring>
#include<map>
#include<iomanip>
#include<set>
#define ll long long
#define pb(x) push_back(x)
using namespace std;
typedef pair<int,int> ii;
const int XMAX = 50005;
const int MOD = 997;
const int NMAX = 15;
const int KMAX = 55;
ifstream fin("calatorie1.in");
ofstream fout("calatorie1.out");
int dp[XMAX],catalan[XMAX],v[NMAX];
//dp[i] = numarul de moduri de a ajunge la (i,i)
bool mp[XMAX];
int pow2(int n,int e)
{
int p = 1;
while(e)
{
if(e&1)
p = (p*n)%MOD;
n = (n*n)%MOD;
e>>=1;
}
return p;
}
int main()
{
int i,j,X,N,K;
fin>>X>>K;
fin>>N;
for(i = 1 ; i <= N ; ++i)
fin>>v[i],mp[v[i]] = 1;
//precalculez catalan
catalan[1] = catalan[0] = 1;
for(i = 2 ; i <= X ; ++i)
catalan[i] =( ((2*(2*i-1)*catalan[i-1])%MOD) * pow2(i+1 , MOD-2) )%MOD;
K>>=1;
dp[0] = 1;
for(i = 1 ; i <= X ; ++i)
{
if(mp[i])
continue;
for(j = max(i-K , 0) ; j < i ; ++j)
{
if(!mp[j])
dp[i] = (dp[i] + 2*catalan[i-j-1]*dp[j])%MOD;
}
}
fout<<dp[X];
return 0;
}