Pagini recente » Cod sursa (job #125166) | Cod sursa (job #149942) | Cod sursa (job #1932618) | Cod sursa (job #3141198) | Cod sursa (job #1771971)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("pod.in");
ofstream fout("pod.out");
const int nmax = 1005,kmax = 25;
const int mod = 9901;
int N,M,K,v[nmax],a[kmax][kmax],z[kmax][kmax],b[kmax][kmax],ans[kmax][kmax];
inline void Read()
{
int i;
fin >> N >> M >> K;
for(i = 1; i <= M; i++)
fin >> v[i];
sort(v+1,v+M+1);
v[++M] = N + 1;
}
inline void Cpy(int a[kmax][kmax], int b[kmax][kmax])
{
for(int i = 1; i <= K; i++)
for(int j = 1; j <= K; j++)
a[i][j] = b[i][j];
}
inline void Init(int a[kmax][kmax])
{
int i;
Cpy(a,z);
for(i = 1; i < K; i++)
a[i+1][i] = 1;
a[1][K] = 1;
a[K][K] = 1;
}
inline void MultMat(int a[kmax][kmax], int b[kmax][kmax])
{
int i,j,k,s,aux[kmax][kmax];
Cpy(aux,z);
for(i = 1; i <= K; i++)
for(j = 1; j <= K; j++)
{
s = 0;
for(k = 1; k <= K; k++)
s = (s + a[i][k]*b[k][j]);
aux[i][j] = s%mod;
}
Cpy(a,aux);
}
inline void LG_Pow(int a[kmax][kmax], int p)
{
int aux[25][25];
Cpy(aux,z);
for(int i = 1; i <= K; i++) aux[i][i] = 1;
while(p)
{
if(p % 2 == 1)
{
p--;
MultMat(aux,a);
}
if(p)
{
p/=2;
MultMat(a,a);
}
}
MultMat(ans,aux);
}
inline void Solve()
{
int i,j;
for(i = 1; i < K; i++) b[i+1][i] = 1;
for(i = 1; i <= K; i++) ans[i][i] = 1;
for(i = 1; i <= M; i++)
{
Init(a);
LG_Pow(a,v[i]-v[i-1]-1);
if(i < M) MultMat(ans,b);
}
fout << ans[K][K] << "\n";
}
int main()
{
Read();
Solve();
fout.close();
return 0;
}