Cod sursa(job #324921)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 18 iunie 2009 00:06:00
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>

#define file_in "rsir.in"
#define file_out "rsir.out"

#define Nmax 7012

int t0,t1,x,y,a,b,z,m,mod=0;
long long x1[Nmax];
long long x2[Nmax];
long long n;
int tt0,tt1,t40,t41;

inline void go(int &t0,int &t1)   
{   
     int c=t1;   
     t1=x1[t0]+x2[t1];   
     if (t1>=m) 
		 t1-=m;   
     t1+=z;   
     if (t1>=m) 
		 t1-=m;   
     t0=c;   
}   

int main()
{
	int i;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d %d %d %d %d %d %d %lld", &t0,&t1,&a,&b,&x,&y,&z,&m,&n);
	t0%=m;
	t1%=m;
	z%=m;
	
	if (n==0)
	{
		printf("%d", t0);
		
		fclose(stdin);
		fclose(stdout);
		
		return 0;
	}
	
	if (n==1)
	{
		printf("%d", t1);
		
		fclose(stdin);
		fclose(stdout);
		
		return 0;
	}
	
	for (i=0;i<m;++i)
		 x1[i]=(1LL*i*i*a+x*i)%m;
	for (i=0;i<m;++i)
		 x2[i]=(1LL*i*i*b+y*i)%m;
	
	//for (i=0;i<m;++i)
		// printf("%d %d\n", x1[i],x2[i]);
	
	tt0=t40=t0;
	tt1=t41=t1;
	
	do  
    {               
        go(t0,t1);   
        go(tt0,tt1);   
        go(tt0,tt1);   
    }   
    while ((tt0!=t0) || (tt1!=t1));   

	
	do  
    {   
	   mod++;	
       go(t0,t1);   
    }   
    while ((tt0!=t0) || (tt1!=t1));  
		
	while ((t40!=t0) || (t41!=t1))   
	{
		n--;
		go(t40,t41);
		if (n==0)
		{
			printf("%d", t41);
			
			fclose(stdin);
			fclose(stdout);
			
			return 0;
		}
	}
	
	n%=mod;
	for (i=1;i<n;++i) 
		go(t40,t41);   
    printf("%d\n", t41); 

		
		
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}