Pagini recente » Cod sursa (job #2854678) | Cod sursa (job #124469) | Cod sursa (job #271884) | Cod sursa (job #1769868) | Cod sursa (job #1004129)
#include<stdio.h>
#include<algorithm>
#include<iostream>
#define FOR(i,a,b)\
for(int i=a; i<=b; ++i)
#define infile "input.in"
#define outfile "pod.out"
#define mMax 1005
#define kMax 23
#define MOD 9901
using namespace std;
int v[1010],N,M,K,rez;
struct Matrix{
int M[22][22];
int L,C;
#define A (*this)
Matrix(){
for(int i=0;i<22;++i)
for(int j=0;j<22;++j)
M[i][j]=0;
}
Matrix operator* (Matrix B){
Matrix C;
C.L=A.L;
C.C=B.C;
for(int i=1;i<=C.L;++i)
for(int j=1;j<=C.C;++j)
for(int k=1;k<=C.C;++k)
C.M[i][j] = (C.M[i][j] + A.M[i][k]*B.M[k][j])%9901;
return C;
}
} EXP,DP;
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=K;
EXP.C=K;
for(int i=1;i<K;++i)
EXP.M[i+1][i]=1;
EXP.M[1][K] = 1;
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(int i=1;i<=M;++i)
{
pow(v[i] - v[i-1]);
if(i<M)
DP.M[1][K] = 0;
}
rez = DP.M[1][K];
}
int main()
{
//freopen("input.in","r",stdin);
freopen("pod.in","r",stdin);
freopen("pod.out","w",stdout);
cin>>N>>M>>K;
for(int i=1;i<=M;++i)
cin>>v[i];
solve();
cout<<rez;
}