Cod sursa(job #2040895)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 16 octombrie 2017 17:32:46
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>
#define Nmax 25
#define Mmax 1005
#define MOD 9901
using namespace std;
ifstream f("pod.in");
ofstream g("pod.out");
int n,m,K;
int add[Nmax][Nmax];
int b[Nmax][Nmax];
int sol[Nmax][Nmax];
int dp[Nmax];
int gap[Mmax];
inline void read()
{
    f>>n>>m>>K;
    for(int i=1;i<=m;i++)
        f>>gap[i];
}
inline 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 k=1;k<=K;k++)
             aux[i][j]+=a[i][k]*b[k][j];
     }

     for(int i=1;i<=K;i++)
      for(int j=1;j<=K;j++)
       a[i][j]=aux[i][j]%MOD;
}
inline void mat_pow(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;
    for(int i=0;p>>i;i++)
    {
        if(((p>>i)&1)) mult(sol,add);
        mult(add,add);
    }
}
inline void solve()
{
    sort(gap+1,gap+m+1);
    gap[++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++)
    {
        mat_pow(gap[i]-gap[i-1]-1);
        if(i<m) mult(sol,b);
    }
    g<<sol[K][K];
}

int main()
{
    read();
    solve();

    return 0;
}