Cod sursa(job #1906075)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 6 martie 2017 12:13:13
Problema Pod Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <string.h>


using namespace std;

const int M = 1020 ;
const int K = 23 ;
const int MOD = 9901 ;

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

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

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


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

    }
}

void INIT ( ){
    static int i  ;

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

    mat [ 1 ][ k ] = 1 ;
    mat [ k ][ k ] = 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 ] ;


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

    for ( i = 1 ; i <= k ; i ++ ){
        for ( j = 1 ; j <= k ;j ++ ){
            a [ i ] [ j ] = b [ i ] [ j ] ;
        }
    }

}



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 [ 1 ][ k ] = 1 ;


    for ( i = 1 ; i <= k   ; i ++ ){
        StartMat [ i ][ i - 1 ] =1 ;
    }

    StartMat [ 1 ][ k ] = 1 ;
    StartMat [ k ][ k ] = 1 ;


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

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

        MultiplyMat( sol , mat );

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


    }

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

    return 0;
}