Pagini recente » Cod sursa (job #2798296) | Cod sursa (job #1333086) | Cod sursa (job #197811) | Cod sursa (job #570622) | Cod sursa (job #2354836)
#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;
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;
}
void lgput(vector<vector<int>> &ans, const vector<vector<int>> &x, int p, int k) {
vector<vector<int>> base(k + 1, vector<int> (k + 1, 0));
for(int i = 1; i <= k; i ++)
for(int j = 1; j <= k; j ++)
base[i][j] = x[i][j];
while(p) {
if(p % 2) {
multiply(ans, base, k, k, k);
for(int i = 1; i <= k; i ++)
for(int j = 1; j <= k; j ++)
ans[i][j] = mat[i][j];
}
multiply(base, base, k, k, k);
for(int i = 1; i <= k; i ++)
for(int j = 1; j <= k; j ++)
base[i][j] = mat[i][j];
p /= 2;
}
}
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;
for(auto it : events) {
int dif = it - last;
last = it;
vector<vector<int>> ans(k + 1, vector<int> (k + 1, 0));
for(int i = 1; i <= k; i ++)
ans[i][i] = 1;
lgput(ans, base, dif, k);
multiply(ans, 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;
}
/// daca scandura n e lipsa?