Pagini recente » Cod sursa (job #2609908) | Cod sursa (job #1947999) | Cod sursa (job #2159820) | Cod sursa (job #2890254) | Cod sursa (job #2694395)
#include <bits/stdc++.h>
#define MOD 9901
using namespace std;
ifstream in("pod.in");
ofstream out("pod.out");
int n,m,k,ans;
int p[1005];
int sol[21][21],tmp[21][21],a[21][21],dp1[21],dp2[21];
void mult(int a[][21], int b[][21])
{
//initializare
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
tmp[i][j]=0;
}
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
for(int l=1;l<=k;l++)
tmp[i][j]+=a[i][l]*b[l][j];
}
}
//impartire prin mod
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
a[i][j]=tmp[i][j]%MOD;
}
}
void put(int n)
{
for(int i=0;(1<<i)<=n;i++)
{
if((1<<i)&n)
mult(sol,a);
mult(a,a);
}
}
int main()
{
in>>n>>m>>k;
for(int i=1;i<=m;i++)
in>>p[i];
p[m+1]=n;
sort(p+1,p+m+1);
dp2[k]=1;
for(int i=1;i<=m+1;i++)
{
for(int j=1;j<=k;j++)
{
for(int l=1;l<=k;l++)
{
sol[j][l]=(j==l);
if(l==k)
a[j][l]=(j==1||j==k);
else
a[j][l]=(j==l+1);
dp1[j]=0;
}
}
put(p[i]-p[i-1]);
for(int j=1;j<=k;j++)
{
for(int l=1;l<=k;l++)
dp1[j]+=dp2[l]*sol[l][j];
}
for(int j=1;j<=k;j++)
dp2[j]=dp1[j]%MOD;
if(i!=m+1)
dp2[k]=0;
}
out<<dp2[k];
return 0;
}