Cod sursa(job #73896)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 22 iulie 2007 01:07:29
Problema Rsir Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<stdio.h>
long int t0,t1,t4,t5,a,b,c,d,e,m,n,i,j,k,l,r,t02,t12,t2,ret,aa,ii,
p0[17][17],p1[17][17],p2[17][17],p3[17][17],p4[17][17],p5[17][17],
p02[17][17],p12[17][17],p22[17][17],p32[17][17],p42[17][17],
paux[17][17],ee[17][7000];
void pp(long int q[17][17],long int qq[17][17]);
void ad(long int cc,long int q[17][17],long int qq[17][17]);
long int val(long int q[17][17],long int x,long int y);
int main()
{
	FILE *f,*g;
	f=fopen("rsir.in","r");
	g=fopen("rsir.out","w");
	fscanf(f,"%ld%ld",&t0,&t1);
	fscanf(f,"%ld%ld",&a,&b);
	fscanf(f,"%ld%ld%ld",&c,&d,&e);
	fscanf(f,"%ld%ld",&m,&n);
	a=a%m;b=b%m;
	c=c%m;d=d%m;e=e%m;
	t0=t0%m;
	t1=t1%m;
	p0[1][0]=1;p02[2][0]=1;
	p1[0][1]=1;p12[0][2]=1;
	p2[0][0]=e;p2[2][0]=a;p2[0][2]=b;p2[1][0]=c;p2[0][1]=d;
	pp(p2,p22);
	ad(a,p12,p3);
	ad(b,p22,p3);
	ad(c,p1,p3);
	ad(d,p2,p3);
	p3[0][0]+=e;
	pp(p3,p32);
	ad(a,p22,p4);
	ad(b,p32,p4);
	ad(c,p2,p4);
	ad(d,p3,p4);
	p4[0][0]+=e;
	pp(p4,p42);
	ad(a,p32,p5);
	ad(b,p42,p5);
	ad(c,p3,p5);
	ad(d,p4,p5);
	p5[0][0]+=e;
	k=n/4;
	r=n%4;
	while(r)
	{
		t02=(t0*t0)%m;
		t12=(t1*t1)%m;
		t2=(a*t02+b*t12+c*t0+d*t1+e)%m;
		t0=t1;t1=t2;r--;
	}
	for(i=0;i<m;i++){ ee[0][i]=1;for(j=1;j<=16;j++) ee[j][i]=(ee[j-1][i]*i)%m;}
	for(ii=1;ii<=k;ii++)
	{ t4=val(p4,t0,t1);
	  t5=val(p5,t0,t1);
	  t0=t4;
	  t1=t5;
	}
	fprintf(g,"%ld\n",t0);
	fcloseall();
	return 0;
}
void pp(long int q[17][17],long int qq[17][17])
{
	for(i=0;i<=16;i++)
	 for(j=0;j<=16;j++)
	  for(k=0;k<=i;k++)
	   for(l=0;l<=j;l++)
	    { qq[i][j]+=q[k][l]*q[i-k][j-l];
	      qq[i][j]%=m;
	    }
}
void ad(long int cc,long int q[17][17],long int qq[17][17])
{
	for(i=0;i<=16;i++)
	 for(j=0;j<=16;j++)
	  if(q[i][j])
	  { qq[i][j]+=cc*q[i][j];
	    qq[i][j]%=m;
	  }
}

long int val(long int q[17][17],long int x,long int y)
{
	ret=0;
	for(i=0;i<=16;i++)
	 for(j=0;j<=16;j++)
	  { aa=(ee[i][x]*ee[j][y])%m;
	    aa=(q[i][j]*aa)%m;
	    ret+=aa;
	    ret%=m;
	  }
	 return ret;
}