Cod sursa(job #562068)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 22 martie 2011 10:49:53
Problema Pod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#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 ;
}