Cod sursa(job #467275)

Utilizator freak93Adrian Budau freak93 Data 28 iunie 2010 13:45:22
Problema Pod Scor 100
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1.66 kb
#include<fstream>
#include<algorithm>

using namespace std;

const char iname[]="pod.in";
const char oname[]="pod.out";
const int maxk=25;
const int maxm=1005;
const int mod=9901;

ifstream f(iname);
ofstream g(oname);

int n,m,k,base[maxk][maxk],a[maxk][maxk],z[maxk][maxk],i,j,p,v[maxm],b[maxk][maxk],c[maxk][maxk];

inline void copy(int b[][maxk],int a[][maxk],int n,int m)
{
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            a[i][j]=b[i][j];
}

inline void mul(int a[][maxk],int b[][maxk],int c[][maxk],int n,int m,int p)
{
    for(int i=1;i<=n;++i)
        for(int j=1;j<=p;++j)
        {
            c[i][j]=0;
            for(int k=1;k<=m;++k)
                c[i][j]+=a[i][k]*b[k][j];
            c[i][j]%=mod;
        }
}

inline void neutral(int a[][maxk],int n,int m)
{
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            a[i][j]=(int)(i==j);
}

int main()
{
    f>>n>>m>>k;
    for(i=1;i<=m;++i)
        f>>v[i];
    sort(v+1,v+m+1);
    base[1][1]=1;
    z[1][1]=1;
    z[k][1]=1;
    for(i=2;i<=k;++i)
        z[i-1][i]=1;
    v[0]=0;
    for(i=1;i<=m;++i)
    {
        int dis=v[i]-v[i-1];
        neutral(a,k,k);
        copy(z,b,k,k);
        while(dis)
        {
            if(dis&1)
                mul(a,b,c,k,k,k),copy(c,a,k,k);
            mul(b,b,c,k,k,k);copy(c,b,k,k);
            dis/=2;
        }
        mul(base,a,c,1,k,k);
        copy(c,base,1,k);
        base[1][1]=0;
    }
    int dis=n-v[i-1];
    neutral(a,k,k);
    copy(z,b,k,k);
    while(dis)
    {
        if(dis&1)
            mul(a,b,c,k,k,k),copy(c,a,k,k);
        mul(b,b,c,k,k,k);copy(c,b,k,k);
        dis/=2;
    }
    mul(base,a,c,1,k,k);
    g<<c[1][1]<<"\n";
}