Pagini recente » Borderou de evaluare (job #1005339) | Borderou de evaluare (job #358797) | Borderou de evaluare (job #575061) | Borderou de evaluare (job #2414323) | Cod sursa (job #927816)
Cod sursa(job #927816)
#include<cstdio>
#include<algorithm>
#define FOR(i,a,b)\
for(int i=a; i<=b; ++i)
#define infile "pod.in"
#define outfile "pod.out"
#define mMax 1005
#define kMax 23
#define MOD 9901LL
using namespace std;
struct Matrix{
int M[kMax][kMax];
int L, C;
#define A (*this)
Matrix(){
FOR(i,0,kMax-1)
FOR(j,0,kMax-1)
M[i][j] = 0;
}
Matrix operator * (Matrix B){
Matrix C;
FOR(i, 1, A.L)
FOR(j, 1, B.C)
FOR(k, 1, A.C)
C.M[i][j] = (0LL + C.M[i][j] + A.M[i][k] * B.M[k][j]) % MOD;
return C;
}
} EXP, DP;
int V[mMax];
int N, M, K, Sol;
void read(){
freopen(infile, "r", stdin);
scanf("%d %d %d", &N, &M, &K);
FOR(i,1,M)
scanf("%d", &V[i]);
fclose(stdin);
}
void pow(int P){
Matrix M = EXP;
for (int i = 0; (1 << i) <= P; ++i){
if ((1 << i) & P)
DP = DP * M;
M = M * M;
}
}
void solve(){
sort(V+1, V+M+1);
EXP.L = EXP.C = K;
FOR(i,1,K-1)
EXP.M[i + 1][i] = 1;
EXP.M[1][K] = EXP.M[K][K] = 1;
DP.L = 1; DP.C = K;
DP.M[1][K] = 1;
if(V[M] == N)
return;
V[++ M] = N;
FOR(i,1,M){
pow(V[i] - V[i - 1]);
if (i != M)
DP.M[1][K] = 0;
}
Sol = DP.M[1][K];
}
void print(){
freopen(outfile, "w", stdout);
printf("%d\n", Sol);
fclose(stdout);
}
int main(){
read();
solve();
print();
return 0;
}