Cod sursa(job #2241515)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 16 septembrie 2018 11:21:53
Problema Pod Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<fstream>
#include<vector>
#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];
vector<int> Dp;

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])%MOD;
    for(i=1; i<=k; i++)
        for(j=1; j<=k; j++)
            A[i][j]=Aux[i][j];
}

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])%MOD;
    for(i=1; i<=k; i++)
        B[i]=Aux[i][1];
}

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);
    if(P[m]==n)
    {
        fo<<"0\n";
        fi.close();
        fo.close();
        return 0;
    }
    for(i=1; i<k; i++)
        Dp.push_back(0);
    Dp.push_back(1);
    P[++m]=n+1;
    for(i=0; i<m; i++)
    {
        nr=P[i+1]-P[i]-1;
        if(i!=0)
        {
            Dp.push_back(0);
            Dp.erase(Dp.begin(),Dp.begin()+1);
        }
        if(nr>0)
        {
            Dp.push_back(((*Dp.rbegin())+(*Dp.begin()))%MOD);
            Dp.erase(Dp.begin(),Dp.begin()+1);
            if(nr>1)
            {
                for(j=1; j<=k; j++)
                    A[j]=Dp[j-1];
                put(nr-1);
                for(j=1; j<=k; j++)
                    Dp[j-1]=A[j];
            }
        }
    }
    fo<<(*Dp.rbegin())<<"\n";
    fi.close();
    fo.close();
    return 0;
}