Cod sursa(job #600012)

Utilizator edp100Edp100 edp100 Data 30 iunie 2011 12:13:59
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 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[34][34];
    
    matrix(){
    memset(mt,0,sizeof(mt));}
    
    matrix(int c)
    {
        int i;
        memset(mt,0,sizeof(mt));
        for(i=1;i<=k;i++)
            mt[i][i]=c;
    }
    
    matrix operator*(matrix b)
    {
        int i,j,t;
        matrix c(0);
        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 put)
{
    if(!put)
    {
        matrix z(1);
        return z;
    }
    if(put==1)
        return a;
    matrix b=rid_log(a,put/2);
    b=b*b;
    if(put&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;
}