Pagini recente » Cod sursa (job #2048595) | Cod sursa (job #164230) | Cod sursa (job #2725569) | Cod sursa (job #809721) | Cod sursa (job #2486119)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("pod.in");
ofstream fout("pod.out");
int v[1010];
int n, m , p;
const int modu = 9901;
struct matrix{
int m[21][21];
matrix(){
for(int i = 0 ; i < 21 ; i++){
for(int j = 0 ; j < 21 ; j++){
m[i][j] = 0;
}
}
}
matrix operator*(matrix b){
matrix c;
for(int k = 0 ; k < p ; k++){
for(int i = 0 ; i < p ; i++){
for(int j = 0 ; j < p ; j++){
c.m[i][j] = (c.m[i][j] + m[i][k]*b.m[k][j]) % modu;
}
}
}
return c;
}
void print(){
for(int i = 0 ; i < p ; i++){
for(int j = 0 ; j < p ; j++){
cout << m[i][j] << ' ';
}
cout << '\n';
}
}
};
matrix O, I, a, b, c;
matrix puteri[100];
matrix matPow(matrix m, int put){
matrix ans = I;
for(int i = 0 ; (1<<i) <= put ; i++){
if( (1<<i) & put ){
ans = ans * puteri[i];
}
}
return ans;
}
int main()
{
fin >> n >> m >> p;
for(int i = 0 ; i < p ; i++){
I.m[i][i] = 1;
}
for(int i = 0 ; i < p - 1 ; i++){
c.m[i+1][i] = 1;
}
c.m[0][p-1] = 1;
c.m[p-1][p-1] = 1;
puteri[0] = c;
for(int i = 1 ; i <= 50 ; i++){
puteri[i] = puteri[i-1] * puteri[i-1];
}
for(int i = 1 ; i <= m ; i++){
fin >> v[i];
}
sort(v + 1 , v + m + 1);
m++;
a.m[0][p-1] = 1;
v[m] = n + 1;
for(int i = 1 ; i <= m ; i++){
b = c;
b = matPow(b, v[i]-v[i-1]);
a = a * b;
a.m[0][p-1] = 0;
}
fout << a.m[0][p-2];
}