Pagini recente » Cod sursa (job #368305) | Cod sursa (job #598713) | Borderou de evaluare (job #1711715) | Cod sursa (job #2808216) | Cod sursa (job #3358149)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("pod.in");
ofstream out("pod.out");
const int KMAX=20, LMAX=29, MMAX=1e3+5, MOD=9901;
int n, m, k, v[MMAX];
struct matrix
{
int di, dj, mat[KMAX][KMAX];
friend matrix operator*(const matrix &a, const matrix &b)
{
matrix c={a.di, b.dj};
for(int i=0;i<c.di;i++)
for(int j=0;j<c.dj;j++)
{
c.mat[i][j]=0;
for(int k=0;k<a.dj;k++)
c.mat[i][j]=(c.mat[i][j] + a.mat[i][k]*b.mat[k][j]%MOD)%MOD;
}
return c;
}
}dp, mpow[LMAX];
void init_mat()
{
dp={1, k}; mpow[0]={k, k};
dp.mat[0][k-1]=1;
for(int i=0;i<k-1;i++)
mpow[0].mat[i+1][i]=1;
mpow[0].mat[0][k-1]=mpow[0].mat[k-1][k-1]=1;
for(int i=1;i<=LMAX;i++)
mpow[i]=mpow[i-1]*mpow[i-1];
}
void advance(int d)
{
while(d)
{
int b=31-__builtin_clz(d&-d);
dp=dp*mpow[b];
d^=(d&-d);
}
}
int main()
{
in>>n>>m>>k;
for(int i=1;i<=m;i++)
in>>v[i];
sort(v+1, v+m+1);
init_mat();
for(int i=1;i<=m;i++)
{
advance(v[i]-v[i-1]);
dp.mat[0][k-1]=0;
}
advance(n-v[m]);
out<<dp.mat[0][k-1];
return 0;
}