Pagini recente » Cod sursa (job #2936113) | Cod sursa (job #1209243) | Cod sursa (job #3262142) | Cod sursa (job #491992) | Cod sursa (job #595756)
Cod sursa(job #595756)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MOD 9901
int n,m,k,p;
int v[1006];
int rez[56];
int rez2[56];
struct matrix
{
int mt[104][104];
matrix(){
memset(mt,0,sizeof(mt));}
matrix(int c)
{
int i;
for(i=1;i<=k;i++)
mt[i][i]=c;
}
matrix operator*(matrix b)
{
int i,j,t;
matrix c;
for(t=1;t<=k;t++)
for(i=1;i<=k;i++)
for(j=1;j<=k;j++)
{
c.mt[i][j]+=mt[i][t]*b.mt[t][j];
if(c.mt[i][j]>=MOD)
c.mt[i][j]%=MOD;
}
return c;
}
};
matrix mat,mat2;
matrix rid_log(matrix a,int p)
{
if(!p)
{
matrix z(1);
return z;
}
if(p==1)
return a;
matrix b=rid_log(a,p/2);
b=b*b;
if(p&1)
b=b*a;
return b;
}
int main ()
{
int i,j,t;
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]);
v[++m]=n;
for(i=1;i<k;i++)
mat.mt[i][i+1]=1;
mat.mt[k][1]=mat.mt[k][k]=1;
rez[k]=1;
sort(v+1,v+m+1);
for(i=1;i<=m;i++)
{
mat2=rid_log(mat,v[i]-p);
memset(rez2,0,sizeof(rez2));
for(j=1;j<=k;j++)
for(t=1;t<=k;t++)
{
rez2[j]+=mat2.mt[j][t]*rez[t];
if(rez2[j]>=MOD)
rez2[j]%=MOD;
}
if(i<m)
rez2[k]=0;
for(j=1;j<=k;j++)
rez[j]=rez2[j];
p=v[i];
}
printf("%d\n",rez[k]);
return 0;
}