Pagini recente » Cod sursa (job #2851934) | Cod sursa (job #1262227) | Cod sursa (job #330318) | Cod sursa (job #1326672) | Cod sursa (job #1401588)
#include<stdio.h>
#include<algorithm>
#define mod 9901
using namespace std;
struct str
{
int m[25][25];
};
int v[1004],i,n,m,k,sol[100],sol2[100];
str mi,q,c;
str inm(str a , str b)
{
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
{
c.m[i][j]=0;
for(int kp=1;kp<=k;kp++)
c.m[i][j]=(c.m[i][j]+a.m[i][kp]*b.m[kp][j])%mod;
}
return c;
}
str lgput(str a, int k)
{
if(k==1)
return a;
if(k%2==0)
return lgput(inm(a,a),k/2);
return inm(a,lgput(inm(a,a),(k-1)/2));
}
int main()
{
freopen("pod.in","r",stdin);
freopen("pod.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=m;i++)
scanf("%d",&v[i]);
for(i=1;i<k;i++)
mi.m[i][i+1]=1;
mi.m[k][1]=mi.m[k][k]=1;
sort(v+1,v+1+m);
if(v[m]!=n){
m++;
v[m]=n;
}
sol[k]=1;
for(i=1;i<=m;i++)
{
q=lgput(mi,v[i]-v[i-1]);
for(int j=1;j<=k;j++)
{
sol2[j]=0;
for(int u=1;u<=k;u++)
sol2[j]=(sol2[j]+q.m[j][u]*sol[u])%mod;
}
if(i!=m)
sol2[k]=0;
for(int j=1;j<=k;j++)
sol[j]=sol2[j];
}
printf("%d",sol[k]);
return 0;
}