Cod sursa(job #2174259)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 16 martie 2018 11:24:20
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("pod.in");
ofstream g ("pod.out");
const int nmax=23;
const int mmax=1e3+3;
const int mod=9901;
int n,m,k,add[nmax][nmax],b[nmax][nmax],sol[nmax][nmax],dp[nmax],pos[mmax];
void mult(int a[nmax][nmax],int b[nmax][nmax])
{
     int aux[nmax][nmax];
     for(int i=1;i<=k;++i)
     {
            for(int j=1;j<=k;++j)
            {
                  aux[i][j]=0;
                  for(int t=1;t<=k;++t) aux[i][j]+=a[i][t]*b[t][j];
            }
     }
     for(int i=1;i<=k;++i)
     {
           for(int j=1;j<=k;++j) a[i][j]=aux[i][j]%mod;
     }
}
void put(int p)
{
    for(int i=1;i<k;++i)
    {
        for(int j=1;j<=k;++j) add[j][i]=0;
        add[i+1][i]=1;
    }
    for(int i=1;i<=k;++i) add[i][k]=0;
    add[1][k]=add[k][k]=1;
    while(p)
    {
        if(p&1) mult(sol,add);
        mult(add,add);
        p>>=1;
    }
}
int main()
{
    f>>n>>m>>k;
    for(int i=1;i<=m;++i) f>>pos[i];
    sort(pos+1,pos+m+1);
    pos[++m]=n+1;
    for(int i=1;i<=k;++i)
    {
          for(int j=1;j<=k;++j) if(i==j) sol[i][j]=1;
    }
    for(int i=1;i<k;++i) b[i+1][i]=1;
    for(int i=1;i<=m;++i)
    {
        put(pos[i]-pos[i-1]-1);
        if(i<m) mult(sol,b);
    }
    g<<sol[k][k];
    return 0;
}