Cod sursa(job #2241543)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 16 septembrie 2018 12:07:15
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include<fstream>
#include<algorithm>
#define MOD 9901
using namespace std;
ifstream fi("pod.in");
ofstream fo("pod.out");
int n,m,k,i,j,nr,P[1005],A[25],Aux[25][25],Mat[25][25],Rez[25][25],val,ad;
int Dp[25];

void inm(int A[][25], int B[][25])
{
    int i,j,ind;
    for(i=1; i<=k; i++)
        for(j=1; j<=k; j++)
            Aux[i][j]=0;
    for(i=1; i<=k; i++)
        for(j=1; j<=k; j++)
            for(ind=1; ind<=k; ind++)
                Aux[i][j]=Aux[i][j]+A[i][ind]*B[ind][j];
    for(i=1; i<=k; i++)
        for(j=1; j<=k; j++)
        {
            A[i][j]=Aux[i][j];
            if(A[i][j]>=MOD)
                A[i][j]%=MOD;
        }
}

void inm(int A[][25], int B[])
{
    int i,j;
    for(i=1; i<=k; i++)
        Aux[i][1]=0;
    for(i=1; i<=k; i++)
        for(j=1; j<=k; j++)
            Aux[i][1]=(Aux[i][1]+A[i][j]*B[j]);
    for(i=1; i<=k; i++)
    {
        B[i]=Aux[i][1]%MOD;
        if(B[i]>=MOD)
            B[i]%=MOD;
    }
}

void put(int b)
{
    int i;
    for(i=1; i<=k; i++)
        for(j=1; j<=k; j++)
            Mat[i][j]=Rez[i][j]=0;
    for(i=1; i<k; i++)
    {
        Mat[i][i+1]=1;
        Rez[i][i]=1;
    }
    Mat[k][1]=Mat[k][k]=1;
    Rez[k][k]=1;
    for(i=0; (1<<i)<=b; i++)
    {
        if((1<<i)&b)
            inm(Rez,Mat);
        inm(Mat,Mat);
    }
    inm(Rez,A);
}

int main()
{
    fi>>n>>m>>k;
    for(i=1; i<=m; i++)
        fi>>P[i];
    sort(P+1,P+m+1);
    P[++m]=n+1;
    for(i=0; i<m; i++)
    {
        if(i==0)
            ad=1;
        else
            ad=0;
        nr=P[i+1]-P[i]-1;
        if(nr>0)
        {
            if(k==1)
                val=ad;
            else
                val=Dp[2];
            for(j=3; j<=k; j++)
                Dp[j-2]=Dp[j];
            Dp[k-1]=ad;
            Dp[k]=(val+Dp[k-1]);
            if(Dp[k]>=MOD)
                Dp[k]-=MOD;
            if(nr>1)
            {
                for(j=1; j<=k; j++)
                    A[j]=Dp[j];
                put(nr-1);
                for(j=1; j<=k; j++)
                    Dp[j]=A[j];
            }
        }
        else
        {
            for(j=2; j<=k; j++)
                Dp[j-1]=Dp[j];
            Dp[k]=ad;
        }
    }
    fo<<Dp[k]<<"\n";
    fi.close();
    fo.close();
    return 0;
}