Cod sursa(job #595833)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 14 iunie 2011 15:59:34
Problema Pod Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 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)
    {
 /*   	printf("LUME LUME pentru %d:\n",p);
    	for(int i=1;i<=k;i++,printf("\n"))
    		for(int j=1;j<=k;j++)
    			printf("%d ",a.mt[i][j]);*/
        return a;
    }    
    matrix b=rid_log(a,p/2);
    b=b*b;
    if(p&1)
        b=b*a;
/*    printf("LUME LUME pentru %d:\n",p);
    	for(int i=1;i<=k;i++,printf("\n"))
    		for(int j=1;j<=k;j++)
    			printf("%d ",b.mt[i][j]);    */
    return b;
}


int main ()
{
    int i,j,t;
    
    freopen("pod.in","r",stdin);
    freopen("pod.out","w",stdout);
    
/*    printf("SA MOR EU %d\n",(9812*9812+9634*9634)%9901);*/
    
    scanf("%d%d%d",&n,&m,&k);
/*	printf("n=%d\n",n);*/
    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);
    /*printf("m=%d\n",m);*/
    for(i=1;i<=m;i++)
    {
    	/*printf("CACAT %d\n",v[i]-p);*/
        mat2=rid_log(mat,v[i]-p);
       /* for(j=1;j<=k;j++,printf("\n"))
        	for(t=1;t<=k;t++)
        		printf("%d ",mat2.mt[j][t]);
        printf("k=%d\n",k);		*/
        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("p=%d\n",p);*/
    }
    printf("%d\n",rez[k]);
    return 0;
}