Cod sursa(job #1127632)

Utilizator gerd13David Gergely gerd13 Data 27 februarie 2014 13:10:54
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <algorithm>
#include <cstring>


using namespace std ;
const int NMAX = 1010 ;
const int QMAX = 22 ;
const int MOD = 9901 ;

void Initializare();
void Rezolvare();
void Afisare() ;
void Putere(int) ;
void Multiplex(int, int) ;

ifstream cin("pod.in") ;
ofstream cout("pod.out") ;

int N , M, K, ans[QMAX][QMAX], A[QMAX][QMAX], V[NMAX] ;

inline void Initializare()
{
    cin >> N >> M >> K ;
    for(int i = 1; i <= M ; ++ i)
        cin >> V[i] ;
    sort(V + 1, V + M + 1) ;
        ans[1][K] =   1 ;
        V[ ++ M] = N ;

}

inline void Multiplex(int A[QMAX][QMAX], int B[QMAX][QMAX])
{
    int  C[QMAX][QMAX] ;
    memset(C, 0, sizeof(C)) ;

    for(int i = 1 ; i <= K ; ++ i)
        for(int j = 1; j<= K ; ++ j)
            for(int y = 1 ; y <= K ; ++ y)
                C[i][j] = C[i][j] + A[i][y] * B[y][j] ;
     for(int i = 1 ; i <= K ; ++ i)
        for(int j = 1; j<= K ; ++ j)
            A[i][j] = C[i][j] % MOD ;

}

inline void Putere(int p)
{
    for(int i = 1 ; i <= K ; ++ i)
    {for(int j = 1; j <= K ; ++ j)
        A[i][j] = 0;
        A[i][i - 1] = 1 ;
    }
    A[1][K] = A[K][K] = 1 ;

    for(int i = 0 ; (1 << i) <= p ; ++ i){
        if(p & (1 << i))
            Multiplex(ans, A) ;
        Multiplex(A, A) ;

    }


}

inline void Rezolvare()
{

    for(int i = 1 ; i <= M ; ++ i)
    {
        Putere(V[i] - V[i - 1]) ;
        if(i < M) ans[1][K] = 0 ;
    }

}

inline void Afisare()
{
    /*for(int i =1 ; i <= K ;++ i)
        cout << V[i] << ' ' ;
        cout << '\n' ;
        */
        cout << ans[1][K] ;
}



int main()
{
    Initializare() ;
    Rezolvare() ;
    Afisare() ;

    cin.close() ;
    cout.close() ;
    return 0 ;
}