Cod sursa(job #1474928)

Utilizator enedumitruene dumitru enedumitru Data 23 august 2015 10:12:58
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("pod.in"); ofstream g("pod.out");
const int maxk=25;
const int mod=9901;
typedef int matrix[maxk][maxk];
int n,m,k,i,j,p,v[1005];
matrix a,b,c,base,z;
inline void copy(matrix b, matrix a)
{   for(int i=1;i<=k;++i)
        for(int j=1;j<=k;++j)
            a[i][j]=b[i][j];
}
inline void copy1(matrix b, matrix a)
{   for(int j=1;j<=k;++j) a[1][j]=b[1][j];}
inline void mul(matrix a, matrix b, matrix c)
{   for(int i=1;i<=k;++i)
        for(int j=1;j<=k;++j)
        {   c[i][j]=0;
            for(int t=1;t<=k;++t) c[i][j]+=a[i][t]*b[t][j];
            c[i][j]%=mod;
        }
}
inline void mul1(matrix a, matrix b, matrix c)
{   for(int j=1;j<=k;++j)
        {   c[1][j]=0;
            for(int t=1;t<=k;++t) c[1][j]+=a[1][t]*b[t][j];
            c[1][j]%=mod;
        }
}
inline void neutral(matrix a)
{   for(int i=1;i<=k;++i)
        for(int j=1;j<=k;++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);
        copy(z,b);
        while(dis)
        {   if(dis&1) {mul(a,b,c); copy(c,a);}
            mul(b,b,c); copy(c,b);
            dis/=2;
        }
        mul1(base,a,c); copy1(c,base);
        base[1][1]=0;
    }
    int dis=n-v[i-1];
    neutral(a); copy(z,b);
    while(dis)
    {   if(dis&1) {mul(a,b,c); copy(c,a);}
        mul(b,b,c); copy(c,b);
        dis/=2;
    }
    mul1(base,a,c);
    g<<c[1][1]<<"\n"; g.close(); return 0;
}