Cod sursa(job #927819)

Utilizator razvan.popaPopa Razvan razvan.popa Data 26 martie 2013 02:03:54
Problema Pod Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<fstream>
#include<algorithm>
#define FOR(i,a,b)\
   for(int i=a; i<=b; ++i)
#define infile "pod.in"
#define outfile "pod.out"
#define mMax 1005
#define kMax 23
#define MOD 9901LL
using namespace std;

struct Matrix{
	int M[kMax][kMax];
	int L, C;

    #define A (*this)

	Matrix(){
		FOR(i,0,kMax-1)
		   FOR(j,0,kMax-1)
		      M[i][j] = 0;
	}

	Matrix operator * (Matrix B){
		Matrix C;
		C.L = A.L;
		C.C = B.C;

		FOR(i, 1, C.L)
		   FOR(j, 1, C.C)
		      FOR(k, 1, C.C)
		          C.M[i][j] = (0LL + C.M[i][j] + A.M[i][k] * B.M[k][j]) % MOD;

		return C;
	}
} EXP, DP;


int V[mMax];

int N, M, K, Sol;


void read(){
    ifstream f(infile);

    f >> N >> M >> K;

    FOR(i, 1, M)
       f >> V[i];

    f.close();
}

void pow(int P){
	Matrix M = EXP;

	for (int i = 0; (1LL << i) <= P; ++i){
		if ((1LL << i) & P)
			DP = DP *  M;

	    M = M * M;
	}
}

void solve(){
    sort(V+1, V+M+1);

    EXP.L = EXP.C = K;
    FOR(i,1,K-1)
        EXP.M[i + 1][i] = 1;
    EXP.M[1][K] = EXP.M[K][K] = 1;

    DP.L = 1; DP.C = K;
    DP.M[1][K] = 1;

    if(V[M] == N)
    	return;

    V[++ M] = N;

    FOR(i,1,M){
        pow(V[i] - V[i - 1]);

        if (i < M)
        	DP.M[1][K] = 0;
    }

    Sol = DP.M[1][K];
}

void print(){
    ofstream g(outfile);

    g << Sol << '\n';

    g.close();
}

int main(){
    read();
    solve();
    print();

    return 0;
}