Pagini recente » Cod sursa (job #2745752) | Cod sursa (job #2579502) | Cod sursa (job #875030) | Cod sursa (job #1241994) | Cod sursa (job #2241068)
#include <bits/stdc++.h>
using namespace std;
const int MOD = 9901;
const int MAXM = 1000;
const int MAXK = 20;
inline void mod(int &x) {
if(x < 0)
x += MOD;
if(x >= MOD)
x -= MOD;
}
int pos[MAXM + 1], k;
int a[MAXK + 1][MAXK + 1], sol[MAXK + 1][MAXK + 1];
int ways[MAXK + 1], aux[MAXK + 1];
inline void multiply(int a[MAXK + 1][MAXK + 1], int b[MAXK + 1][MAXK + 1]) {
int c[MAXK + 1][MAXK + 1];
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= k; j++) {
c[i][j] = 0;
for(int p = 1; p <= k; p++) {
c[i][j] += a[i][p] * b[p][j];
}
}
}
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= k; j++) {
a[i][j] = c[i][j] % MOD;
}
}
}
inline void lgput(int b) {
int i;
memset(a, 0, sizeof(a));
for(i = 1; i < k; i++) {
a[i + 1][i] = 1;
}
a[1][k] = 1;
a[k][k] = 1;
memset(sol, 0, sizeof(sol));
for(i = 1; i <= k; i++) {
sol[i][i] = 1;
}
while(b > 0) {
if(b & 1)
multiply(sol, a);
b >>= 1;
multiply(a, a);
}
}
int main() {
FILE *fi, *fout;
int i, j, n, m;
fi = fopen("pod.in" ,"r");
fout = fopen("pod.out" ,"w");
fscanf(fi,"%d %d %d " ,&n,&m,&k);
for(i = 1; i <= m; i++) {
fscanf(fi,"%d " ,&pos[i]);
}
sort(pos + 1, pos + m + 1);
ways[k] = 1;
for(int p = 1; p <= m; p++) {
lgput(pos[p] - pos[p - 1]);
for(i = 1; i < k; i++) {
aux[i] = 0;
for(j = 1; j <= k; j++) {
aux[i] += sol[j][i] * ways[j];
}
}
for(i = 1; i < k; i++) {
ways[i] = aux[i] % MOD;
}
ways[k] = 0;
}
lgput(n - pos[m]);
int ans = 0;
for(j = 1; j <= k; j++) {
ans = (ans + sol[j][k] * ways[j]) % MOD;
}
fprintf(fout,"%d" ,ans);
fclose(fi);
fclose(fout);
return 0;
}