Pagini recente » Cod sursa (job #593619) | Cod sursa (job #2410660) | Cod sursa (job #771466) | Cod sursa (job #2216250) | Cod sursa (job #562068)
Cod sursa(job #562068)
#include<stdio.h>
#define Mod 9901
#define Mmax 1010
#define Kmax 25
int M[Kmax][Kmax],A[Kmax][Kmax],S[Kmax][Kmax],C[Kmax][Kmax],v[Mmax],x[Kmax],a[Kmax];
int i,K,n,m,sol,k,j,last;
void init ()
{
int i,j;
for( i = 1 ; i <= K ; i++ )
for( j = 1 ; j <= K ; j++ )
M[i][j] = 0;
for( i = 1 ; i < K ; i++ )
M[i][i+1] = 1 ;
M[K][1] = M[K][K] = 1;
}
void copiaza (int A[Kmax][Kmax], int B[Kmax][Kmax])
{
int i,j;
for( i = 1 ; i <= K ; i++ )
for( j = 1 ; j <= K ; j++ )
A[i][j] = B[i][j];
}
void inmulteste (int A[Kmax][Kmax], int B[Kmax][Kmax])
{
int i,j,k;
for( i = 1 ; i <= K ; i++ )
for( j = 1 ; j <= K ; j++ )
C[i][j] = 0;
for( i = 1 ; i <= K ; i++ )
for( j = 1 ; j <= K ; j++ )
for( k = 1 ; k <= K ; k++ )
{
C[i][j]+= A[i][k] * B[k][j] ;
if( C[i][j] > Mod ) C[i][j] %= Mod;
}
copiaza(A,C);
}
void lgput ( int b )
{
int i,j;
for( i = 1 ; i <= K ; i++ )
for( j = 1 ; j <= K ; j++ )
S[i][j] = 0;
init();
for( i = 1 ; i <= K ; i++ ) S[i][i] = 1 ;
for( ; b ; b>>=1, inmulteste(M,M) )
if(b&1)
inmulteste(S,M);
copiaza(M,S);
}
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]);
if( K > n )
{
if( M ) printf("0");
else printf("1");
return 0 ;
}
v[++m] = n ;
last = K ;
for( i = 1 ; i <= K ; i++ ) x[i] = 1 ;
if( v[1] < K )
for( i = v[1]+1 ; i <= K ; i++ )
x[i] = 0 ;
for( i = 1 ; v[i] < K ; i++ ) ;
for( k = i ; k <= m ; k++ )
{
lgput(v[k]-last);
for( i = 1 ; i <= K ; i++ )
a[i] = 0 ;
for( i = 1 ; i <= K ; i++ )
for( j = 1 ; j <= K ; j++ )
{
a[i] += M[i][j] * x[j];
if( a[i] > Mod ) a[i] %= Mod ;
}
for( i = 1 ; i <= K ; i++ )
x[i] = a[i] ;
sol = x[K] ; x[K] = 0 ;
last = v[k];
}
printf("%d",sol);
return 0 ;
}