Pagini recente » Cod sursa (job #1181434) | Cod sursa (job #1764217) | Cod sursa (job #167599) | Cod sursa (job #2057617) | Cod sursa (job #2372139)
#include <fstream>
using namespace std;
ifstream cin ("pod.in");
ofstream cout ("pod.out");
int n, m, k, ans;
int p[1005];
int v[3][3], sol[3][3], tmp[3][3], a[3][3];
void mult(int a[][3], int b[][3], int c[][3]) {
for(int i = 1; i <= 2; i++) {
for(int j = 1; j <= 2; j++) {
for(int k = 1; k <= 2; k++)
c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % 9901;
}
}
}
void init1(int a[][3]) {
for(int i = 1; i <= 2; i++) {
for(int j = 1; j <= 2; j++)
a[i][j] = 0;
}
}
void init2(int a[][3], int b[][3]) {
for(int i = 1; i <= 2; i++) {
for(int j = 1; j <= 2; j++)
a[i][j] = b[i][j];
}
}
int fib(int n) {
if(n <= 2)
return 1;
v[1][1] = 0;
v[1][2] = v[2][1] = v[2][2] = 1;
n--;
init2(a, v);
sol[1][1] = sol[2][2] = 1;
for(int i = 0; (1 << i) <= n; i++) {
if((1 << i) & n) {
init1(tmp);
mult(sol, a, tmp);
init2(sol, tmp);
}
init1(tmp);
mult(a, a, tmp);
init2(a, tmp);
}
return sol[2][2];
}
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= m; i++)
cin >> p[i];
p[m + 1] = n + 1;
ans = 1;
for(int i = 0; i <= m; i++)
ans = ans * fib(p[i + 1] - p[i] - 1) % 9901;
cout << ans;
return 0;
}