Pagini recente » Cod sursa (job #2684052) | Cod sursa (job #1347239) | Cod sursa (job #899192) | Cod sursa (job #177433) | Cod sursa (job #2486004)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("pod.in");
ofstream fout("pod.out");
long long v[1010];
int D[100010], cur;
long long indici[100010];
long long 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 matPow(matrix m, long long int put){
if( put == 0 ) return I;
if( put == 1 ) return m;
matrix aux = matPow(m, put / 2);
aux = aux * aux;
if(put % 2 == 1)
aux = aux * m;
return aux;
}
set<long long> sit;
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[i][p-1] = 1;
}
c.m[p-1][p-1] = 1;
for(int i = 1 ; i <= m ; i++){
fin >> v[i];
}
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];
}