Pagini recente » Cod sursa (job #1482436) | Cod sursa (job #1229900) | Cod sursa (job #377405) | Cod sursa (job #1022811) | Cod sursa (job #2432633)
#include <bits/stdc++.h>
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'
using namespace std;
const int MOD = 9901;
struct Matrix {
int n, m;
vector<vector<int>> a;
Matrix(int n, int m) : n(n), m(m), a(n, vector<int>(m)) {}
vector<int>& operator[](const int pos) {
return a[pos];
}
Matrix operator*(Matrix b) const {
Matrix res(n, b.m);
assert(m == b.n);
for (int i = 0; i < n; ++i) {
for (int k = 0; k < m; ++k) {
for (int j = 0; j < b.m; ++j) {
res[i][j] += a[i][k] * b[k][j];
}
}
}
for (int i = 0; i < n; ++i) for (int j = 0; j < b.m; ++j) if (res[i][j] >= MOD) res[i][j] %= MOD;
return res;
}
};
int main() {
ifstream cin("pod.in");
ofstream cout("pod.out");
ios::sync_with_stdio(0);
cin.tie(0);
int n, m, k; cin >> n >> m >> k;
vector<int> v(m);
for (int i = 0; i < m; ++i) {
cin >> v[i];
}
sort(v.begin(), v.end()); // ffs
Matrix tr(k, k);
for (int i = k - 1; i >= 1; --i) {
tr[i][i - 1] = 1;
}
tr[0][k - 1] = tr[k - 1][k - 1] = 1;
Matrix dp(1, k);
dp[0][k - 1] = 1;
int lg = 0; while ((1 << lg) <= n) ++lg;
vector<Matrix> pows(lg, Matrix(k, k));
pows[0] = tr;
for (int i = 1; i < lg; ++i) {
pows[i] = move(pows[i - 1] * pows[i - 1]);
}
auto mult = [&](Matrix &a, int e) {
for (int bit = 0; (1 << bit) <= e; ++bit) {
if (e & (1 << bit))
a = move(a * pows[bit]);
}
};
int last = 0;
for (int i = 0; i < m; ++i) {
int e = v[i] - last;
mult(dp, e);
dp[0][k - 1] = 0; // dp[v[i]] = 0
last = v[i];
}
mult(dp, n - last);
cout << dp[0][k - 1] << endl;
#ifdef LOCAL_DEFINE
cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
return 0;
}