Cod sursa(job #2038169)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 13 octombrie 2017 13:55:44
Problema Pod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>
#define Mmax 1001
#define Kmax 21
#define MOD 9901
using namespace std;
ifstream f("pod.in");
ofstream g("pod.out");
int good[Mmax];
int M[Kmax][Kmax];
int r[Mmax][Mmax];
int v[Mmax];
int c[Mmax][Mmax];
int ans[Mmax];
#define a M
int main()
{
    int n,m,K,i,j,k;
    f>>n>>m>>K;
    for(i=1;i<=n;i++)
        f>>good[i];
    sort(good+1,good+m+1);
    for(i=2;i<=K;i++)
        M[i][i-1]=1;
    M[1][K]=M[K][K]=1;
    int poz=1;
    bool ok=true;
    for(i=1;i<K;i++)
    {
        r[i][i]=1;
        if(i==good[poz])
        {
            ++poz;
            ok=false;
        }
        if(ok) v[i]=1;
    }
    v[K]=v[K-1]+1;
    r[K][K]=1;
    int N=n-K-1;
    while(N)
    {
        if(N&1)
        {
            for(i=1;i<=K;i++)
                for(j=1;j<=K;j++)
                {
                    c[i][j]=0;
                    for(k=1;k<=K;k++)
                        c[i][j]=(c[i][j]+(r[i][k]*a[k][j])%MOD)%MOD;
                }
            for(i=1;i<=K;i++)
                for(j=1;j<=K;j++)
                r[i][j]=c[i][j];
        }
        N>>=1;
        for(i=1;i<=K;i++)
            for(j=1;j<=K;j++)
            {
                c[i][j]=0;
                for(k=1;k<=K;k++)
                    c[i][j]=(c[i][j]+(a[i][k]*a[k][j])%MOD)%MOD;
            }
        for(i=1;i<=K;i++)
            for(j=1;j<=K;j++)
                a[i][j]=c[i][j];
    }
    for(i=1;i<=K;i++)
        for(j=1;j<=K;j++)
            ans[i]=(ans[i]+(v[i]*r[j][i])%MOD)%MOD;
    g<<ans[K];

    return 0;
}