Pagini recente » Cod sursa (job #623508) | Cod sursa (job #2937220) | Cod sursa (job #1862059) | Cod sursa (job #699706) | Cod sursa (job #2925957)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("pod.in");
ofstream fout("pod.out");
int n, m, k, M[25][25], sLipsa[1005], mx[25][25], z[25][25], sol[25][25];
void Copy(int a[25][25], int b[25][25]){
for(int i = 1; i <= k; i++)
for(int j = 1; j <= k; j++)
a[i][j] = b[i][j];
}
void InitM(int a[25][25]){
Copy(a, z);
for(int i = 1; i < k; i++)
a[i + 1][i] = 1;
a[1][k] = 1;
a[k][k] = 1;
}
void MultMt(int a[25][25], int b[25][25]){
int c[25][25];
Copy(c, z);
for(int i = 1; i <= k; i++)
for(int j = 1; j <= k; j++){
c[i][j] = 0;
for(int l = 1; l <= k; l++)
c[i][j] = (c[i][j] + a[i][l] * b[l][j]) % 9901;
}
Copy(a, c);
}
void LogPow(int a[25][25], int p){
int id[25][25];
Copy(id, z);
for(int i = 1; i <= k; i++)
id[i][i] = 1;
while(p){
if(p & 1)
MultMt(id, a);
MultMt(a, a);
p /= 2;
}
MultMt(sol, id);
}
int main()
{
fin >> n >> m >> k;
for(int i = 1; i <= m; i++)
fin >> sLipsa[i];
sort(sLipsa + 1, sLipsa + m + 1);
sLipsa[++m] = n + 1;
for(int i = 1; i < k; i++)
M[i + 1][i] = 1;
for(int i = 1; i <= k; i++)
sol[i][i] = 1;
for(int i = 1; i <= m; i++){
InitM(mx);
LogPow(mx, sLipsa[i] - sLipsa[i - 1] - 1);
if(i < m) MultMt(sol, M);
}
fout << sol[k][k] << "\n";
fout.close();
return 0;
}