Cod sursa(job #124191)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 18 ianuarie 2008 14:44:10
Problema Rsir Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<stdio.h>
struct nod
{	int suc;
	int poz;
	nod *next;
};
long int a,b,x,y,z,m,t0,t1,t2,i,p2[7001],e0[7001],e1[7001],p1,p0,k;
long long int n,pas,r;
nod *p[7001],*pp;
void pune();
int main()
{	FILE *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",&x,&y,&z);
	fscanf(f,"%ld",&m);
	fscanf(f,"%lld",&n);
	t0=t0%m; t1=t1%m;
	for(i=0;i<m;i++) p2[i]=(i*i)%m;
	for(i=0;i<m;i++) { e0[i]=(a*p2[i]+x*i+z)%m;
			   e1[i]=(b*p2[i]+y*i)%m;
			  }

	for(i=0;;i++)
	{ pune(); pp=p[e0[t0]]->next;
	  while(pp){ if(pp->suc==t1)
		     {p1=1+p[e0[t0]]->poz; p0=1+pp->poz; break;}
		     pp=pp->next;
		    }
	  if(pp) break;
	  t2=(e0[t0]+e1[t1])%m;
	  t0=t1; t1=t2;
	}
	t2=(e0[t0]+e1[t1])%m;t0=t1; t1=t2;
	pas=(long long int)p1-(long long int)p0;
	r=(n-(long long int)p0)%pas;
	k=(long int)r;
	for(i=1;i<=k;i++)
	{ t2=(e0[t0]+e1[t1])%m;
	  t0=t1;
	  t1=t2;
	}
	fprintf(g,"%ld",t0);
	fcloseall();
	return 0;
}
void pune()
{	nod *paux;
	paux=new nod;
	paux->suc=t1;
	paux->poz=i;
	if(!p[e0[t0]]){ paux->next=0; p[e0[t0]]=paux; return;}
	paux->next=p[e0[t0]]; p[e0[t0]]=paux;
}