Pagini recente » Cod sursa (job #2812847) | Cod sursa (job #1163948) | Cod sursa (job #690397) | Cod sursa (job #1540825) | Cod sursa (job #757773)
Cod sursa(job #757773)
#include <cstring>
#include <fstream>
#include <algorithm>
using namespace std;
const int MOD = 9901;
struct matrix
{
int V[22][22];
matrix()
{
memset(V, 0, sizeof(V));
}
};
matrix one;
int N, M, K;
int A[1002];
matrix todo, now;
matrix inm(const matrix& M1, const matrix& M2)
{
matrix result;
for (int i = 1; i <= K; ++i)
for (int j = 1; j <= K; ++j)
for (int k = 1; k <= K; ++k)
result.V[i][j] = (result.V[i][j] + 1LL * M1.V[i][k] * M2.V[k][j]) % MOD;
return result;
}
matrix power(const matrix& B, int C)
{
if (C == 0) return one;
if (C & 1) return inm(B, power(B, C - 1));
return power(inm(B, B), C >> 1);
}
int main()
{
ifstream fin("pod.in");
ofstream fout("pod.out");
for (int i = 1; i <= 20; ++i)
one.V[i][i] = 1;
fin >> N >> M >> K;
for (int i = 1; i <= M; ++i)
fin >> A[i];
sort(A + 1, A + M + 1);
if (A[M] == N)
{
fout << 0 << '\n';
fin.close();
fout.close();
return 0;
}
++M, A[M] = N;
now.V[1][K] = 1;
for (int i = 1; i <= K - 1; ++i)
todo.V[i + 1][i] = 1;
todo.V[K][K] = 1;
todo.V[1][K] = 1;
for (int i = 1; i <= M; ++i)
{
matrix pownow = todo;
now = inm(now, power(pownow, A[i] - A[i - 1]));
if (i != M) now.V[1][K] = 0;
}
fout << now.V[1][K] << '\n';
fin.close();
fout.close();
}