Pagini recente » Cod sursa (job #292493) | Cod sursa (job #1887253) | Cod sursa (job #1593483) | Cod sursa (job #608046) | Cod sursa (job #1004152)
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<fstream>
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];
if(C.M[i][j]>=2000000)
C.M[i][j]%=9901;
}
if(C.M[i][j]>=2000000)
C.M[i][j]%=9901;
}
return C;
}
} EXP,DP;
inline 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);
ifstream fin("pod.in");
ofstream fout("pod.out");
fin>>N>>M>>K;
for(int i=1;i<=M;++i)
fin>>v[i];
solve();
fout<<rez%9901;
return 0;
}