Pagini recente » Diferente pentru utilizator/amethyst intre reviziile 6 si 5 | Cod sursa (job #1150086) | Cod sursa (job #595833)
Cod sursa(job #595833)
#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)
{
/* printf("LUME LUME pentru %d:\n",p);
for(int i=1;i<=k;i++,printf("\n"))
for(int j=1;j<=k;j++)
printf("%d ",a.mt[i][j]);*/
return a;
}
matrix b=rid_log(a,p/2);
b=b*b;
if(p&1)
b=b*a;
/* printf("LUME LUME pentru %d:\n",p);
for(int i=1;i<=k;i++,printf("\n"))
for(int j=1;j<=k;j++)
printf("%d ",b.mt[i][j]); */
return b;
}
int main ()
{
int i,j,t;
freopen("pod.in","r",stdin);
freopen("pod.out","w",stdout);
/* printf("SA MOR EU %d\n",(9812*9812+9634*9634)%9901);*/
scanf("%d%d%d",&n,&m,&k);
/* printf("n=%d\n",n);*/
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);
/*printf("m=%d\n",m);*/
for(i=1;i<=m;i++)
{
/*printf("CACAT %d\n",v[i]-p);*/
mat2=rid_log(mat,v[i]-p);
/* for(j=1;j<=k;j++,printf("\n"))
for(t=1;t<=k;t++)
printf("%d ",mat2.mt[j][t]);
printf("k=%d\n",k); */
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("p=%d\n",p);*/
}
printf("%d\n",rez[k]);
return 0;
}