Pagini recente » Cod sursa (job #1796006) | Cod sursa (job #2204893) | Cod sursa (job #33719) | Cod sursa (job #472598) | Cod sursa (job #1127632)
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std ;
const int NMAX = 1010 ;
const int QMAX = 22 ;
const int MOD = 9901 ;
void Initializare();
void Rezolvare();
void Afisare() ;
void Putere(int) ;
void Multiplex(int, int) ;
ifstream cin("pod.in") ;
ofstream cout("pod.out") ;
int N , M, K, ans[QMAX][QMAX], A[QMAX][QMAX], V[NMAX] ;
inline void Initializare()
{
cin >> N >> M >> K ;
for(int i = 1; i <= M ; ++ i)
cin >> V[i] ;
sort(V + 1, V + M + 1) ;
ans[1][K] = 1 ;
V[ ++ M] = N ;
}
inline void Multiplex(int A[QMAX][QMAX], int B[QMAX][QMAX])
{
int C[QMAX][QMAX] ;
memset(C, 0, sizeof(C)) ;
for(int i = 1 ; i <= K ; ++ i)
for(int j = 1; j<= K ; ++ j)
for(int y = 1 ; y <= K ; ++ y)
C[i][j] = C[i][j] + A[i][y] * B[y][j] ;
for(int i = 1 ; i <= K ; ++ i)
for(int j = 1; j<= K ; ++ j)
A[i][j] = C[i][j] % MOD ;
}
inline void Putere(int p)
{
for(int i = 1 ; i <= K ; ++ i)
{for(int j = 1; j <= K ; ++ j)
A[i][j] = 0;
A[i][i - 1] = 1 ;
}
A[1][K] = A[K][K] = 1 ;
for(int i = 0 ; (1 << i) <= p ; ++ i){
if(p & (1 << i))
Multiplex(ans, A) ;
Multiplex(A, A) ;
}
}
inline void Rezolvare()
{
for(int i = 1 ; i <= M ; ++ i)
{
Putere(V[i] - V[i - 1]) ;
if(i < M) ans[1][K] = 0 ;
}
}
inline void Afisare()
{
/*for(int i =1 ; i <= K ;++ i)
cout << V[i] << ' ' ;
cout << '\n' ;
*/
cout << ans[1][K] ;
}
int main()
{
Initializare() ;
Rezolvare() ;
Afisare() ;
cin.close() ;
cout.close() ;
return 0 ;
}