Pagini recente » Cod sursa (job #2634592) | Cod sursa (job #2571185) | Cod sursa (job #405799) | Cod sursa (job #2677249) | Cod sursa (job #2491451)
#include <bits/stdc++.h>
using namespace std;
ifstream f("pod.in");
ofstream g("pod.out");
const int mod = 9901;
const int MMAX = 1005;
int n,m,k;
int v[MMAX];
struct matrix{
int mat[21][21];
matrix(){
for(int i = 0 ; i < 21 ; i++)
for(int j = 0 ; j < 21 ; j++)
mat[i][j] = 0;
}
matrix operator*(matrix b){
matrix c;
for(int o = 0 ; o < k ; o++)
for(int i = 0 ; i < k ; i++)
for(int j = 0 ; j < k ; j++)
c.mat[i][j] = (c.mat[i][j] + mat[i][o] * b.mat[o][j]) % mod;
return c;
}
};
matrix Initial, C, P[105];
matrix a,b,c;
matrix matPow(matrix m, int p){
matrix ans = Initial;
for(int i = 0 ; (1 << i) <= p ; i++)
if((1 << i) & p)
ans = ans * P[i];
return ans;
}
int main(){
int i,j;
f >> n >> m >> k;
for(i = 0 ; i < k ; i++)
Initial.mat[i][i] = 1;
for(i = 0 ; i < k - 1 ; i++)
C.mat[i + 1][i] = 1;
C.mat[0][k - 1] = 1;
C.mat[k - 1][k - 1] = 1;
P[0] = C;
for(i = 1 ; i <= 50 ; i++)
P[i] = P[i - 1] * P[i - 1];
for(i = 1 ; i <= m ; i++)
f >> v[i];
sort(v + 1, v + m + 1);
v[++m] = n + 1;
a.mat[0][k - 1] = 1;
for(i = 1 ; i <= m ; i++){
b = c;
b = matPow(b, v[i] - v[i - 1]);
a = a * b;
a.mat[0][k - 1] = 0;
}
g << a.mat[0][k - 2];
return 0;
}