Cod sursa(job #927788)

Utilizator razvan.popaPopa Razvan razvan.popa Data 26 martie 2013 00:48:50
Problema Pod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<cstdio>
#include<algorithm>
#define INF (1 << 30)
#define FOR(i,a,b)\
   for(int i=a; i<=b; ++i)
#define FORR(i,a,b)\
   for(int i=a; i>=b; --i)
#define infile "pod.in"
#define outfile "pod.out"
#define mMax 1005
#define kMax 21
#define MOD 9901
using namespace std;

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

    #define A (*this)

	Matrix(int L, int C){
		A.L = L;
		A.C = C;

		FOR(i,0,L)
		   FOR(j,0,C)
		      M[i][j] = 0;
	}

	Matrix operator * (const Matrix &B)const{
		Matrix C(A.L, B.C);

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

int V[mMax];

int N, M, K, Sol;

void read(){
    freopen(infile, "r", stdin);
    
    scanf("%d %d %d", &N, &M, &K);
    
    FOR(i,1,M)
       scanf("%d", &V[i]);

    fclose(stdin);
}

Matrix pow(Matrix M, int K){
	if(!K)
		return *I;

	Matrix r = pow(M, K>>1);
	r = r * r;

	if(K & 1)
		r = r * M;

	return r;
}

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

/***********************************/

    Matrix EXP(K,K), DP(1,K);

    I = new Matrix(K,K);
    FOR(i,1,K)
       (*I).M[i][i] = 1;

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

    DP.M[1][0] = 1;

/***********************************/

    int i, iM = 1;
    for(i = 1; i <= K; ++i){
        if(V[iM] != i)
        	FORR(j, i-1, max(0, i-K))
        	   DP.M[1][i] = (DP.M[1][i] + DP.M[1][j]) % MOD;
        else{
        	FORR(j,K-1,1)
        	   DP.M[1][j] = DP.M[1][j+1];
        	DP.M[1][K] = 0;
        	iM ++;
        }
    }

    i --;

    while(iM <= M){
    	DP = DP * pow(EXP, V[iM] - i - 1);
    	i = V[iM ++];

    	FORR(j,K-1,1)
    		DP.M[1][j] = DP.M[1][j+1];
    	       DP.M[1][K] = 0;
    }
    
    DP = DP * pow(EXP, N - i);
    
    Sol = DP.M[1][K];
}

void print(){
    freopen(outfile, "w", stdout);
    
    printf("%d\n", Sol);
    
    fclose(stdout);
}

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

    return 0;
}