Pagini recente » Cod sursa (job #148720) | Cod sursa (job #2476330) | Cod sursa (job #1414799) | Cod sursa (job #1165466) | Cod sursa (job #2356914)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <utility>
#include <cstring>
using namespace std;
const int MOD = 9901;
const int KMAX = 25;
const int LOGMAX = 30;
int mat[KMAX][KMAX];
void multiply(const vector<vector<int>> &x, const vector<vector<int>> &y, int n, int m, int p) {
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= p; j ++)
mat[i][j] = 0;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= p; j ++)
for(int k = 1; k <= m; k ++)
mat[i][j] = (mat[i][j] + x[i][k] * y[k][j]) % MOD;
}
int main() {
ifstream in("pod.in");
ofstream out("pod.out");
int n, m, k;
in >> n >> m >> k;
vector<int> events(m, 0);
for(int i = 0; i < m; i ++)
in >> events[i];
sort(events.begin(), events.end());
events.push_back(n);
vector<vector<int>> dp(k + 1, vector<int> (2, 0));
int last = 0;
dp[k][1] = 1;
vector<vector<int>> base(k + 1, vector<int> (k + 1, 0));
for(int i = 1; i < k; i ++)
base[i][i + 1] = 1;
base[k][1] = base[k][k] = 1;
vector<vector<vector<int>>> powers(1 + LOGMAX, vector<vector<int>> (k + 1, vector<int> (k + 1, 0)));
for(int i = 1; i <= k; i ++)
for(int j = 1; j <= k; j ++)
powers[0][i][j] = base[i][j];
for(int step = 1; step <= LOGMAX; step ++) {
multiply(powers[step - 1], powers[step - 1], k, k, k);
for(int i = 1; i <= k; i ++)
for(int j = 1; j <= k; j ++)
powers[step][i][j] = mat[i][j];
}
for(auto it : events) {
int dif = it - last;
last = it;
for(int step = LOGMAX; step >= 0; step --) {
if(dif & (1 << step)) {
multiply(powers[step], dp, k, k, 1);
for(int i = 1; i <= k; i ++)
dp[i][1] = mat[i][1];
}
}
if(it < n)
dp[k][1] = 0;
}
out << dp[k][1];
return 0;
}