Cod sursa(job #73918)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 22 iulie 2007 14:39:17
Problema Rsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<stdio.h>
long long int t0,t1,t00,t11,step,a,b,c,d,e,m,n,i,aux,term1[1000],term2[1000],
rest,cat,steps,cod,sum[2000],frecv[1000];
int main()
{
	FILE *f,*g;
	f=fopen("rsir.in","r");
	g=fopen("rsir.out","w");
	fscanf(f,"%lld%lld",&t0,&t1);
	fscanf(f,"%lld%lld",&a,&b);
	fscanf(f,"%lld%lld%lld",&c,&d,&e);
	fscanf(f,"%lld%lld",&m,&n);
	a=a%m;b=b%m;
	c=c%m;d=d%m;e=e%m;
	t0=t0%m;t00=t0;
	t1=t1%m;t11=t1;
	term1[0]=e;
	term1[m]=e;
	for(i=1;i<m;i++){ sum[i]=i;sum[i+m]=i;term1[i]=(a*i*i+c*i+e)%m;term2[i]=(b*i*i+d*i)%m;term1[i+m]=term1[i];term2[i+m]=term2[i];}
	frecv[t0]=1;
	for(;;)
	{ aux=term1[t0]+term2[t1];
	  aux=sum[aux];
	  steps++;
	  t0=t1;frecv[t0]++;
	  t1=aux;
	  if(steps==n) {cod=1;break;}
	  if(frecv[t0]==2){ cod=2;break;}
	}
	if(cod==1)
	{ fprintf(g,"%lld\n",t0);
	  fcloseall();
	  return 0;
	}
	t00=t0;t11=t1;n=n-steps;steps=0;
	for(;;)
	{ aux=term1[t0]+term2[t1];
	  aux=sum[aux];
	  t0=t1;
	  t1=aux;
	  cat++;steps++;
	  if(steps==n){cod=1;break;}
	  if(t00==t0&&t11==t1){ cod=2;break;}
	}
	if(cod==1)
	{ fprintf(g,"%lld\n",t0);
	  fcloseall();
	  return 0;
	}
	n=n%cat;
	for(i=1;i<=n;i++)
	{ aux=term1[t0]+term2[t1];
	  aux=sum[aux];
	  t0=t1;
	  t1=aux;
	}
	fprintf(g,"%lld\n",t0);
	fcloseall();
	return 0;
}