Pagini recente » Cod sursa (job #337368) | Cod sursa (job #1326584) | Cod sursa (job #1226481) | Cod sursa (job #2688232) | Cod sursa (job #2240387)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("pod.in"); ofstream fout ("pod.out");
typedef long long i64;
const int kmax = 20;
const int mod = 9901;
int p;
struct Matrice {
int v[kmax][kmax];
void init () {
memset(v, 0, sizeof(v));
for (int i = 0; i < p; ++ i) {
v[i][i] = 1;
}
}
Matrice operator * (const Matrice &shp) const {
Matrice ans;
memset(ans.v, 0, sizeof(ans.v));
for (int i = 0; i < p; ++ i) {
for (int k = 0; k < p; ++ k) {
for (int j = 0; j < p; ++ j) {
ans.v[i][j] += v[i][k] * shp.v[k][j];
}
}
}
for (int i = 0; i < p; ++ i)
for (int j = 0; j < p; ++ j)
ans.v[i][j] %= mod;
return ans;
}
Matrice operator ^ (int n) {
Matrice b = *this;
Matrice ans; ans.init();
while (n) {
if (n & 1) {
ans = ans * b;
}
n >>= 1;
b = b * b;
}
return ans;
}
} st, tr;
int main () {
int n, m;
fin >> n >> m >> p;
vector<int> lipsa(m);
for (int i = 0; i < m; ++ i) {
fin >> lipsa[i];
}
sort(lipsa.begin(), lipsa.end());
tr.v[0][0] = tr.v[p - 1][0] = 1;
for (int i = 0; i + 1 < p; ++ i)
tr.v[i][i + 1] = 1;
st.v[0][0] = 1;
int lst = 0;
for (auto i : lipsa) {
st = st * (tr ^ (i - 1 - lst));
lst = i;
for (int j = 1; j < p; ++ j)
st.v[0][j] = st.v[0][j - 1];
st.v[0][0] = 0;
}
st = st * (tr ^ (n - lst));
lst = n;
fout << st.v[0][0] << "\n";
fin.close();
fout.close();
return 0;
}