Cod sursa(job #1905929)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 6 martie 2017 11:41:54
Problema Pod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <string.h>


using namespace std;

const int M = 1010 ;
const int K = 21 ;
const int MOD = 9901 ;

int n , m , k ;
int mat [ K ][ K ] , sol [ K ][ K ] , StartMat [ K ][ K ] , tempmat[ K ][ K ] ;

void MultiplyMat ( int a [ ][ K ] , int b[ ] [ K ] ){
    static int i , j , idx  ;

    for ( i = 0 ; i < k ; i ++ ){
        for ( j = 0 ; j < k ; j++ ){
            tempmat[ i ][ j ] = 0 ;
            for ( idx = 0 ; idx < k ; idx ++ ){
                tempmat[ i ][ j ] += ( a[ i ][ idx ] * b [ j ][ idx ]) % MOD;
            }
            tempmat [ i ][ j ] %= MOD ;
        }
    }


    for ( i = 0 ; i < k ; i ++ ){
        for ( j = 0 ; j < k ; j ++ ){
            a [ i ][ j ] = tempmat [ i ][ j ] ;
        }

    }
}

void INIT ( ){
    static int i  ;

    memset ( mat , 0 , sizeof mat );
    for ( i = 0 ; i < k - 1  ; i ++ ){
        mat [ i ][ i + 1 ] = 1 ;
        StartMat [ i ][ i + 1 ] =1 ;
    }

    mat [ k -  1 ][ 0 ] = 1 ;
    mat [ k -  1 ][ k - 1 ] = 1 ;
    StartMat [ k -  1 ][ 0 ] = 1 ;
    StartMat [ k -  1 ][ k - 1 ] = 1 ;
}

void FastMult ( int power ){

    if ( power == 1 ){
        return ;
    }

    FastMult( power/2 );

    MultiplyMat( mat , mat );

    if ( power % 2 == 1) {
        MultiplyMat( mat , StartMat );
    }

}

int MissingWoods [ M ] ;






int main(){
    int i ;

    freopen("pod.in","r",stdin);
    freopen("pod.out","w",stdout);

    scanf("%d%d%d",&n,&m,&k);


    for ( i = 1 ; i <= m ; i ++ ){
        scanf("%d",&MissingWoods [ i ]);
    }

    MissingWoods [ ++m ] = n ;

    sort ( MissingWoods + 1 , MissingWoods + m + 1 );



    sol [ 0 ][ k - 1 ] = 1 ;

    for ( i = 1 ; i <= m ; i ++ ){

        INIT();
        FastMult( MissingWoods [ i ] - MissingWoods [ i - 1 ] );

        MultiplyMat( sol , mat );

        if ( i - m ){
            sol [ 0 ][ k - 1 ] = 0 ;
        }


    }

    printf("%d", sol [ 0 ][ k  - 1 ] );

    return 0;
}