Pagini recente » Cod sursa (job #1356899) | Cod sursa (job #1428837) | Cod sursa (job #702692) | Cod sursa (job #2039244) | Cod sursa (job #467091)
Cod sursa(job #467091)
#include <fstream>
#include <algorithm>
using namespace std;
const int MAX_M = 1005;
const int MAX_K = 25;
const int MOD = 9901;
ifstream fin ("pod.in");
ofstream fout ("pod.out");
int N, M, K, lipsa[MAX_M], din[MAX_K];
int mat1[MAX_K][MAX_K], mat2[MAX_K][MAX_K], sol[MAX_K][MAX_K];
void citire() {
fin >> N >> M >> K;
for(int i = 1; i <= M; ++i) {
fin >> lipsa[i];
}
lipsa[++M] = N+1;
}
void buildMat() {
mat1[1][1] = mat1[K][1] = 1;
for(int i = 2; i <= K; ++i) {
mat1[i-1][i] = mat2[i-1][i] = 1;
}
for(int i = 1; i <= K; ++i) {
sol[i][i] = 1;
}
/* for(int i = 1; i <= K; ++i) {
for(int j = 1; j <= K; ++j) {
fprintf(stderr, "%d ", mat2[i][j]);
}
fprintf(stderr, "\n");
}*/
}
void inmult(int m1[MAX_K][MAX_K], int m2[MAX_K][MAX_K]) {
int aux[MAX_K][MAX_K];
for(int i = 1; i <= K; ++i)
for(int j = 1; j <= K; ++j) {
aux[i][j] = 0;
for(int k = 1; k <= K; ++k) {
aux[i][j] = (aux[i][j] + m1[i][k] * m2[k][j]) % MOD;
}
}
for(int i = 1; i <= K; ++i)
for(int j = 1; j <= K; ++j)
m1[i][j] = aux[i][j];
}
void pow(int sol[MAX_K][MAX_K], int put) {
int aux[MAX_K][MAX_K];
for(int i = 1; i <= K; ++i)
for(int j = 1; j <= K; ++j) {
aux[i][j] = mat1[i][j];
}
for(; put; put >>= 1) {
if(put & 1) {
inmult(sol, aux);
}
inmult(aux, aux);
}
}
void multMat() {
for(int i = 1; i <= M; ++i) {
if(lipsa[i] <= K) continue;
pow(sol, lipsa[i] - max(K, lipsa[i-1])-1);
// if(lipsa[i] == 4)
// fprintf(stderr, "%d %d\n", sol[1][1], sol[1][2]);
if(lipsa[i] <= N)
inmult(sol, mat2);
}
}
void solve() {
int aux[MAX_K];
aux[0] = 1;
for(int i = 1; i <= K; ++i) {
aux[i] = 0;
bool ok = 0;
for(int j = 1; j <= M; ++j)
if(i == lipsa[j])
ok = true;
if(ok) continue;
aux[i] = (aux[i] + aux[i-1]) % MOD;
if(i == K) {
aux[i] = (aux[i] + aux[i-K]) % MOD;
}
}
for(int i = 1; i <= K; ++i) {
din[i] = aux[K+1-i];
}
//fprintf(stderr, "%d %d ", din[1], din[2]);
int Sol = 0;
for(int i = 1; i <= K; ++i) {
Sol += din[i] * sol[i][1];
Sol %= MOD;
}
fout << Sol;
}
int main() {
citire();
buildMat();
multMat();
solve();
}