Cod sursa(job #1004152)

Utilizator timicsIoana Tamas timics Data 2 octombrie 2013 10:44:16
Problema Pod Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<fstream>

using namespace std;

int v[1010],N,M,K,rez;

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

#define A (*this)
    Matrix(){
        for(int i=0;i<22;++i)
            for(int j=0;j<22;++j)
                M[i][j]=0;
    }

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

        for(int i=1;i<=C.L;++i)
            for(int j=1;j<=C.C;++j)
            {
                for(int k=1;k<=C.C;++k)
                {
                    C.M[i][j] = C.M[i][j] + A.M[i][k]*B.M[k][j];
                    if(C.M[i][j]>=2000000)
                        C.M[i][j]%=9901;
                }
                if(C.M[i][j]>=2000000)
                    C.M[i][j]%=9901;
            }

        return C;
    }
} EXP,DP;

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

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

void solve()
{
    sort(v+1,v+M+1);
    EXP.L=K;
    EXP.C=K;
    for(int i=1;i<K;++i)
        EXP.M[i+1][i]=1;

    EXP.M[1][K] = 1;
    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(int i=1;i<=M;++i)
    {
        pow(v[i] - v[i-1]);
        if(i<M)
            DP.M[1][K] = 0;
    }
    rez = DP.M[1][K];
}

int main()
{
    //freopen("input.in","r",stdin);
    ifstream fin("pod.in");
    ofstream fout("pod.out");
    fin>>N>>M>>K;
    for(int i=1;i<=M;++i)
        fin>>v[i];
    solve();
    fout<<rez%9901;
    return 0;
}