Pagini recente » Cod sursa (job #1514857) | Cod sursa (job #866049) | Cod sursa (job #284289) | Cod sursa (job #2232453) | Cod sursa (job #1906031)
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int M = 1020 ;
const int K = 23 ;
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 ][ K ] , int b[ K ] [ K ] ){
static int i , j , idx ;
for ( i = 1 ; i <= k ; i ++ ){
for ( j = 1 ; j <= k ; j++ ){
tempmat[ i ][ j ] = 0 ;
for ( idx = 1 ; idx <= k ; idx ++ ){
tempmat[ i ][ j ] += a[ i ][ idx ] * b [ idx ][ j ];
}
tempmat [ i ][ j ] %= MOD ;
}
}
for ( i = 1 ; i <= k ; i ++ ){
for ( j = 1 ; j <= k ; j ++ ){
a [ i ][ j ] = tempmat [ i ][ j ] ;
}
}
}
void INIT ( ){
static int i ;
memset ( mat , 0 , sizeof mat );
for ( i = 1 ; i <= k ; i ++ ){
mat [ i ][ i - 1 ] = 1 ;
}
mat [ 1 ][ k ] = 1 ;
mat [ k ][ k ] = 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 ] ;
void cpy ( int a [ ][ K ] , int b [ ][ K ] ){
static int i , j ;
for ( i = 1 ; i <= k ; i ++ ){
for ( j = 1 ; j <= k ;j ++ ){
a [ i ] [ j ] = b [ i ] [ j ] ;
}
}
}
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 [ 1 ][ k ] = 1 ;
for ( i = 1 ; i <= k ; i ++ ){
StartMat [ i ][ i - 1 ] =1 ;
}
StartMat [ 1 ][ k ] = 1 ;
StartMat [ k ][ k ] = 1 ;
for ( i = 1 ; i <= m ; i ++ ){
INIT();
FastMult( MissingWoods [ i ] - MissingWoods [ i - 1 ] );
MultiplyMat( sol , mat );
if ( i - m ){
sol [ 1 ][ k ] = 0 ;
}
}
printf("%d", sol[ 1 ] [ k ] );
return 0;
}