Cod sursa(job #1482238)

Utilizator andrettiAndretti Naiden andretti Data 6 septembrie 2015 18:37:27
Problema Pod Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<stdio.h>
#include<algorithm>
#define maxn 25
#define maxm 1005
#define MOD 9901
using namespace std;

int n,m,K;
int add[maxn][maxn],b[maxn][maxn];
int sol[maxn][maxn],dp[maxn];
int gap[maxm];

void read()
{
    scanf("%d %d %d",&n,&m,&K);
    for(int i=1;i<=m;i++) scanf("%d",&gap[i]);
}

inline void mult(int a[maxn][maxn],int b[maxn][maxn])
{
    int aux[maxn][maxn];

    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])%MOD;
             if(aux[i][j]>=MOD) aux[i][j]-=MOD;
         }
     }

     for(int i=1;i<=K;i++)
      for(int j=1;j<=K;j++)
       a[i][j]=aux[i][j];
}

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);
    }
}

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);
    }

    printf("%d",sol[K][K]);
}

int main()
{
    freopen("pod.in","r",stdin);
    freopen("pod.out","w",stdout);

    read();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}