Cod sursa(job #1401588)

Utilizator ade_tomiEnache Adelina ade_tomi Data 25 martie 2015 23:47:50
Problema Pod Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb

#include<stdio.h>
#include<algorithm>
#define mod 9901
using namespace std;
struct str
{

    int m[25][25];

};
int v[1004],i,n,m,k,sol[100],sol2[100];
str mi,q,c;
str inm(str a , str b)
{

    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
        {

            c.m[i][j]=0;
            for(int kp=1;kp<=k;kp++)
                c.m[i][j]=(c.m[i][j]+a.m[i][kp]*b.m[kp][j])%mod;

        }
    return c;
}
str lgput(str a, int k)
{
    if(k==1)
        return a;
    if(k%2==0)
        return lgput(inm(a,a),k/2);
    return inm(a,lgput(inm(a,a),(k-1)/2));
}

int main()
{

    freopen("pod.in","r",stdin);
    freopen("pod.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(i=1;i<=m;i++)
        scanf("%d",&v[i]);

    for(i=1;i<k;i++)
        mi.m[i][i+1]=1;
    mi.m[k][1]=mi.m[k][k]=1;
    sort(v+1,v+1+m);
    if(v[m]!=n){
     m++;
    v[m]=n;
    }
    sol[k]=1;
    for(i=1;i<=m;i++)
    {

        q=lgput(mi,v[i]-v[i-1]);
        for(int j=1;j<=k;j++)
        {
            sol2[j]=0;
            for(int u=1;u<=k;u++)
                sol2[j]=(sol2[j]+q.m[j][u]*sol[u])%mod;

        }
        if(i!=m)
            sol2[k]=0;
        for(int j=1;j<=k;j++)
            sol[j]=sol2[j];
    }
    printf("%d",sol[k]);
    return 0;
}