Pagini recente » Cod sursa (job #1202951) | Cod sursa (job #855973) | Cod sursa (job #3176201) | Cod sursa (job #302954) | Cod sursa (job #1759770)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MOD 9901
#define MAXN 1000
#define MAXK 20
int v[MAXN+2];
int rez[MAXK+1][MAXK+1], mat[MAXK+1][MAXK+1], k;
int aux[MAXK+1][MAXK+1], sef[MAXK+1], ans[MAXK+1];
inline void lgput(int n){
int i, j, p;
memset(rez, 0, sizeof rez);
memset(mat, 0, sizeof mat);
for(i=0; i<=k; i++)
rez[i][i]=1;
for(i=1; i<=k; i++)
mat[i][i-1]=1;
mat[1][k]=mat[k][k]=1;
while(n){
if(n%2){
memset(aux, 0, sizeof aux);
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
for(p=1; p<=k; p++)
aux[i][j]+=rez[i][p]*mat[p][j];
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
rez[i][j]=aux[i][j]%MOD;
}
memset(aux, 0, sizeof aux);
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
for(p=1; p<=k; p++)
aux[i][j]+=mat[i][p]*mat[p][j];
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
mat[i][j]=aux[i][j]%MOD;
n/=2;
}
memset(sef, 0, sizeof sef);
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
sef[i]+=ans[j]*rez[j][i];
for(i=1; i<=k; i++)
ans[i]=sef[i]%MOD;
}
int main(){
int a, n, i;
FILE *fin, *fout;
fin=fopen("pod.in", "r");
fout=fopen("pod.out", "w");
fscanf(fin, "%d%d%d", &a, &n, &k);
for(i=1; i<=n; i++)
fscanf(fin, "%d", &v[i]);
std::sort(v+1, v+n+1);
v[n+1]=a;
ans[k]=1;
for(i=1; i<=n+1; i++){
lgput(v[i]-v[i-1]);
if(i<=n) ans[k]=0;
}
fprintf(fout, "%d\n", ans[k]);
fclose(fin);
fclose(fout);
return 0;
}