Pagini recente » Istoria paginii utilizator/colcerpaul | Monitorul de evaluare | Diferente pentru onis-2016/solutii-runda-2 intre reviziile 25 si 23 | Monitorul de evaluare | Cod sursa (job #1900501)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXM 10000
#define MAXK 21
#define MOD 9901
int v[MAXK], p[MAXM + 1], nv[MAXK];
int rm[MAXK][MAXK], m[MAXK][MAXK];
int k;
inline void mult(int m1[MAXK][MAXK], int m2[MAXK][MAXK]){
int i, j, ii;
long long x;
int aux[MAXK][MAXK];
for(i = 0; i < k; i++)
memset(aux[i], 0, sizeof aux[i]);
for(i = 0; i < k; i++){
for(j = 0; j < k; j++){
x = 0;
for(ii = 0; ii < k; ii++){
x += 1LL * m1[i][ii] * m2[ii][j];
}
aux[i][j] = x % MOD;
}
}
for(i = 0; i < k; i++)
for(j = 0; j < k; j++)
m1[i][j] = aux[i][j];
}
inline void calcrm(int x){
int i, j;
for(i = 0; i < k; i++){
memset(m[i], 0, sizeof m[i]);
memset(rm[i], 0, sizeof rm[i]);
}
for(i = 0; i < k - 1; i++){
m[i + 1][i] = 1;
rm[i][i] = 1;
}
rm[k - 1][k - 1] = 1;
m[k - 1][k - 1] = 1;
m[0][k - 1] = 1;
while(x > 0){
if(x & 1)
mult(rm, m);
mult(m, m);
x /= 2;
}
}
inline void mut(int x){
calcrm(x);
int i, j;
long long s;
for(i = 0; i < k; i++)
nv[i] = 0;
for(i = 0; i < k; i++){
s = 0;
for(j = 0; j < k; j++){
s += 1LL * v[j] * rm[j][i];
}
nv[i] = s % MOD;
}
for(i = 0; i < k; i++)
v[i] = nv[i];
}
int main(){
FILE *in = fopen("pod.in", "r");
int n, m, i, l;
fscanf(in, "%d%d%d", &n, &m, &k);
for(i = 0; i < m; i++)
fscanf(in, "%d", &p[i]);
fclose(in);
std::sort(p, p + m);
p[m] = n;
v[k - 1] = 1;
l = 0;
for(i = 0; i <= m; i++){
mut(p[i] - l);
if(p[i] != n)
v[k - 1] = 0;
l = p[i];
}
FILE *out = fopen("pod.out", "w");
fprintf(out, "%d", v[k - 1]);
fclose(out);
return 0;
}