Cod sursa(job #595756)

Utilizator tiganu_dolarMancea Catalin tiganu_dolar Data 13 iunie 2011 22:09:03
Problema Pod Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

#define MOD 9901

int n,m,k,p;
int v[1006];
int rez[56];
int rez2[56];


struct matrix
{
    int mt[104][104];
    matrix(){
    memset(mt,0,sizeof(mt));}
    matrix(int c)
    {
        int i;
        for(i=1;i<=k;i++)
            mt[i][i]=c;
    }
    matrix operator*(matrix b)
    {
        int i,j,t;
        matrix c;
        for(t=1;t<=k;t++)
            for(i=1;i<=k;i++)
                for(j=1;j<=k;j++)
                {
                    c.mt[i][j]+=mt[i][t]*b.mt[t][j];
                    if(c.mt[i][j]>=MOD)
                        c.mt[i][j]%=MOD;
                }
        return c;
    }
};

matrix mat,mat2;

matrix rid_log(matrix a,int p)
{
    if(!p)
    {
        matrix z(1);
        return z;
    }
    if(p==1)
        return a;
    matrix b=rid_log(a,p/2);
    b=b*b;
    if(p&1)
        b=b*a;
    return b;
}


int main ()
{
    int i,j,t;
    
    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]);
    v[++m]=n;
    
    for(i=1;i<k;i++)
        mat.mt[i][i+1]=1;
    mat.mt[k][1]=mat.mt[k][k]=1;
    
    rez[k]=1;
    sort(v+1,v+m+1);
    for(i=1;i<=m;i++)
    {
        mat2=rid_log(mat,v[i]-p);
        memset(rez2,0,sizeof(rez2));
        for(j=1;j<=k;j++)
            for(t=1;t<=k;t++)
            {
                rez2[j]+=mat2.mt[j][t]*rez[t];
                if(rez2[j]>=MOD)
                    rez2[j]%=MOD;
            }
        if(i<m)
            rez2[k]=0;
            
        for(j=1;j<=k;j++)
            rez[j]=rez2[j];
        p=v[i];
    }
    printf("%d\n",rez[k]);
    return 0;
}