Pagini recente » Cod sursa (job #2496218) | Cod sursa (job #1231380) | Cod sursa (job #482335) | Cod sursa (job #2714508) | Cod sursa (job #1905929)
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int M = 1010 ;
const int K = 21 ;
const int MOD = 9901 ;
int n , m , k ;
int mat [ K ][ K ] , sol [ K ][ K ] , StartMat [ K ][ K ] , tempmat[ K ][ K ] ;
void MultiplyMat ( int a [ ][ K ] , int b[ ] [ K ] ){
static int i , j , idx ;
for ( i = 0 ; i < k ; i ++ ){
for ( j = 0 ; j < k ; j++ ){
tempmat[ i ][ j ] = 0 ;
for ( idx = 0 ; idx < k ; idx ++ ){
tempmat[ i ][ j ] += ( a[ i ][ idx ] * b [ j ][ idx ]) % MOD;
}
tempmat [ i ][ j ] %= MOD ;
}
}
for ( i = 0 ; i < k ; i ++ ){
for ( j = 0 ; j < k ; j ++ ){
a [ i ][ j ] = tempmat [ i ][ j ] ;
}
}
}
void INIT ( ){
static int i ;
memset ( mat , 0 , sizeof mat );
for ( i = 0 ; i < k - 1 ; i ++ ){
mat [ i ][ i + 1 ] = 1 ;
StartMat [ i ][ i + 1 ] =1 ;
}
mat [ k - 1 ][ 0 ] = 1 ;
mat [ k - 1 ][ k - 1 ] = 1 ;
StartMat [ k - 1 ][ 0 ] = 1 ;
StartMat [ k - 1 ][ k - 1 ] = 1 ;
}
void FastMult ( int power ){
if ( power == 1 ){
return ;
}
FastMult( power/2 );
MultiplyMat( mat , mat );
if ( power % 2 == 1) {
MultiplyMat( mat , StartMat );
}
}
int MissingWoods [ M ] ;
int main(){
int i ;
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",&MissingWoods [ i ]);
}
MissingWoods [ ++m ] = n ;
sort ( MissingWoods + 1 , MissingWoods + m + 1 );
sol [ 0 ][ k - 1 ] = 1 ;
for ( i = 1 ; i <= m ; i ++ ){
INIT();
FastMult( MissingWoods [ i ] - MissingWoods [ i - 1 ] );
MultiplyMat( sol , mat );
if ( i - m ){
sol [ 0 ][ k - 1 ] = 0 ;
}
}
printf("%d", sol [ 0 ][ k - 1 ] );
return 0;
}