Cod sursa(job #74079)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 23 iulie 2007 19:57:36
Problema Rsir Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<stdio.h>
long long int tt0,tt1,tt2,aa,bb,cc,dd,ee,mm,nn,ii,jj,p0,p1,k,salt,skip,
u[4][7000];
int main()
{
	FILE *f,*g;
	f=fopen("rsir.in","r");
	g=fopen("rsir.out","w");
	fscanf(f,"%lld%lld",&tt0,&tt1);
	fscanf(f,"%lld%lld",&aa,&bb);
	fscanf(f,"%lld%lld%lld",&cc,&dd,&ee);
	fscanf(f,"%lld%lld",&mm,&nn);
	aa=aa%mm;bb=bb%mm;
	cc=cc%mm;dd=dd%mm;ee=ee%mm;
	tt0=tt0%mm;tt1=tt1%mm;
	if(nn==0)
	{
		  fprintf(g,"%lld\n",tt0);
		  fcloseall();
		  return 0;
	}
	if(nn==1)
	{
		  fprintf(g,"%lld\n",tt1);
		  fcloseall();
		  return 0;
	}
	for(ii=0;ii<4;ii++)for(jj=0;jj<mm;jj++)u[ii][jj]=-1;
	if(tt0==tt1)
	 { u[0][tt0]=1;u[1][tt0]=0;}
	else
	 { u[0][tt0]=0;u[0][tt1]=1;}
	for(ii=2;;ii++)
	{
		tt2=(aa*tt0*tt0+bb*tt1*tt1+cc*tt0+dd*tt1+ee)%mm;
		tt0=tt1;
		tt1=tt2;
		if(ii==nn)
		{
		  fprintf(g,"%lld\n",tt1);
		  fcloseall();
		  return 0;
		}
		u[3][tt1]=u[2][tt1];
		u[2][tt1]=u[1][tt1];
		u[1][tt1]=u[0][tt1];
		u[0][tt1]=ii;
		if(tt1!=tt0)
		{ if(u[1][tt1]==u[1][tt0]+1)
		  { p0=u[1][tt0];p1=u[0][tt0];break;}
		}
		else
		{
			if(u[1][tt0]==u[2][tt0]+1)
			{
				fprintf(g,"%lld\n",tt1);
				  fcloseall();
				  return 0;
			}
			else
			if(u[2][tt0]==u[3][tt0]+1)
			{ p0=u[2][tt0];p1=u[0][tt0];break;}
		}
	}
	salt=p1-p0;
	nn=nn-p0;
	k=nn/salt;
	skip=k*salt;
	nn=nn-skip;
	for(ii=0;ii<nn;ii++)
	{
		tt2=(aa*tt0*tt0+bb*tt1*tt1+cc*tt0+dd*tt1+ee)%mm;
		tt0=tt1;
		tt1=tt2;
	}
	fprintf(g,"%lld\n",tt0);
	fcloseall();
	return 0;
}