Pagini recente » Cod sursa (job #2680637) | Cod sursa (job #3247876) | Cod sursa (job #295682) | Cod sursa (job #2665552) | Cod sursa (job #1253507)
#include <algorithm>
#include <cstdio>
#include <cstring>
#define NMAX 1007
#define KMAX 27
#define mod 9901
using namespace std;
int n, m, K;
int A[NMAX];
int Mati[KMAX][KMAX], Dp[KMAX][KMAX], Ans[KMAX][KMAX];
void inmulteste(int Mat[KMAX][KMAX], int A[KMAX][KMAX]){
int C[KMAX][KMAX];
memset(C, 0, sizeof(C));
for(int i = 0; i < K; ++i)
for(int j = 0; j < K; ++j)
for(int k = 0; k < K; ++k)
C[i][j] = C[i][j] + Mat[i][k] * A[k][j];
for(int i = 0; i < K; ++i)
for(int j = 0; j < K; ++j)
Mat[i][j] = C[i][j] % mod;
}
void Init(){
for(int i = 1; i < K; ++i)
Mati[i][i - 1] = 1;
Mati[0][K - 1] = Mati[K - 1][K - 1] = 1;
}
void pw(int B[KMAX][KMAX], int y){
int ret[KMAX][KMAX], D[KMAX][KMAX];
memcpy(ret, B, sizeof(ret));
memcpy(D, Mati, sizeof(D));
for(; y ; y >>= 1){
if(y & 1)
inmulteste(ret, D);
inmulteste(D, D);
}
memcpy(Ans, ret, sizeof(Ans));
}
int main(){
freopen("pod.in", "r", stdin);
freopen("pod.out", "w", stdout);
scanf("%d %d %d", &n, &m, &K);
for(int i = 1; i <= m; ++i)
scanf("%d", &A[i]);
A[++m] = n;
sort(A + 1, A + m + 1);
Init();
Dp[0][K - 1] = 1;
for(int i = 1; i <= m; ++i){
pw(Dp, A[i] - A[i - 1]);
memcpy(Dp, Ans, sizeof(Dp));
if(i < m)
Dp[0][K - 1] = 0;
}
printf("%d\n", Dp[0][K - 1]);
return 0;
}