Cod sursa(job #757772)

Utilizator darrenRares Buhai darren Data 13 iunie 2012 14:21:18
Problema Pod Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#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;
	
	for (int i = 1; i <= K; ++i)
		now.V[1][i] = 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();
}