Cod sursa(job #1903047)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 4 martie 2017 22:42:13
Problema Camera Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <string.h>
#include <algorithm>

#define Kdim 21
#define Mdim 1002
#define MOD 9901
using namespace std;
ifstream fin("pod.in");
ofstream fout("pod.out");
int M[Kdim][Kdim],A[Kdim][Kdim],D[Kdim],V[Mdim],C[Kdim][Kdim];
void create_matrix(int n)
{
    int i;
    for(i=1;i<n;i++)
        M[i+1][i] = 1;
    M[1][n] = M[n][n] = 1;
}
void inmultire(int A1[Kdim][Kdim],int B1[Kdim][Kdim],int n)
{
    int i,j,k;
    memset(C,0,sizeof C);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            for(k=1;k<=n;k++)
                C[i][j] = (C[i][j]+A1[i][k]*B1[k][j])%MOD;
        }
    }
    memcpy(A1,C,sizeof(C));
}
void lgput(int p,int k)
{
    int i,B[Kdim][Kdim];
    memset(A,0,sizeof A);
    for(i=1;i<=k;i++)
        A[i][i] = 1;
    memcpy(B,M,sizeof M);
    for(i=0; (1<<i)<= p;i++)
    {
        if((1<<i) & p)
        {
            inmultire(A,B,k);
        }
        inmultire(B,B,k);
    }
}
int main()
{
    int n,m,k,i,ind=0,p,j,t,AUX[Kdim];
    fin>>n>>m>>k;
    for(i=1;i<=m;i++)
    {
        fin>>V[i];
    }
    sort(V+1,V+m+1);
    V[++m] = n+1;
    D[k] = 1;
    create_matrix(k);
    for(i=1;i<=m;i++)
    {
        p = V[i]-V[i-1];
        lgput(p,k);
        memset(AUX,0,sizeof AUX);
        for(j=1;j<=k;j++)
            for(t = 1;t<=k;t++)
                AUX[j] = (AUX[j]+D[t]*A[t][j])%MOD;
        memcpy(D,AUX,sizeof D);
        D[k] = 0;
    }
    fout<<D[k-1];
    return 0;
}