Cod sursa(job #1453879)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 24 iunie 2015 22:22:51
Problema Pod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define MOD 9901
#define DIM 30

using namespace std;

ifstream fin("pod.in");
ofstream fout("pod.out");
int A[DIM][DIM],B[DIM][DIM],C[DIM][DIM],b[DIM][DIM],D[DIM][DIM];
int v[1002];
int st;
int N,M,K;
void multi(int a[][DIM],int b[][DIM],int c[][DIM],int d){
    for(int i=1;i<=d;i++)
        for(int j=1;j<=d;j++){
            c[i][j]=0;
            for(int k=1;k<=d;k++)
                c[i][j]=(c[i][j] + 1LL * a[i][k] * b[k][j]) % MOD;
        }
}
void copy(int a[][DIM],int b[][DIM],int d){
    for(int i=1;i<=d;i++)
        for(int j=1;j<=d;j++)
            a[i][j]=b[i][j];
}
void pow(int a[][DIM],int b[][DIM],int P){
    for(int i=1;i<=K;i++)
        for(int j=1;j<=K;j++){
            b[i][j]=B[i][j];
            C[i][j]=0;
            if(i==j)
                C[i][j]=1;
        }
    while(P){
        if(P&1){
            multi(C,b,D,K);
            copy(C,D,K);
        }
        multi(b,b,D,K);
        copy(b,D,K);
        P/=2;
    }
    multi(A,C,D,K);
    copy(A,D,K);
}
void afis(int a[][DIM],int d){
    for(int i=1;i<=d;i++){
        for(int j=1;j<=d;j++)
            fout<<a[i][j]<<" ";
        fout<<"\n";
    }
}
int main(){
    fin>>N>>M>>K;
    for(int i=1;i<=K;i++)
        B[i][K]=1;
    for(int i=1;i<K;i++)
        B[i+1][i]=1;
    for(int i=1;i<=M;i++)
        fin>>v[i];
    A[1][K]=1;
    sort(v+1,v+M+1);
    v[++M]=N;
    for(int i=1;i<=M;i++){
        int x=v[i]-v[i-1];
        pow(A,b,x);
        if(i < M)
            A[1][K]=0;
    }
    fout<<A[1][K]<<"\n";
}