Nu aveti permisiuni pentru a descarca fisierul grader_test33.ok
Cod sursa(job #188253)
Utilizator | Data | 7 mai 2008 17:10:36 | |
---|---|---|---|
Problema | Rsir | Scor | 50 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.48 kb |
#include<stdio.h>
unsigned long T0,T1,a,b,x,y,z,M,n,t0,t1,T11,T22;
void citire()
{
freopen("rsir.in","r",stdin);
scanf("%lu%lu%lu%lu%lu%lu%lu%lu%lu",&T0,&T1,&a,&b,&x,&y,&z,&M,&n);
if(T0) T0%=M;
if(T1) T1%=M;
if(a) a%=M;
if(b) b%=M;
if(x) x%=M;
if(y) y%=M;
if(z) z%=M;
}
void gasire_ciclu()
{
//aici gasesc t0,t1,T11,T22
unsigned long i,j,T1i,T1j,T2i,T2j,T3; i=j=0;
T1i=T1j=T0;
T2i=T2j=T1;
do
{//incrementez icu 1
T3=(a*T1i*T1i+b*T2i*T2i+x*T1i+y*T2i+z)%M;
T1i=T2i;
T2i=T3;
i++;
//incrementez j cu 2
T3=(a*T1j*T1j+b*T2j*T2j+x*T1j+y*T2j+z)%M;
T1j=T2j;
T2j=T3;
T3=(a*T1j*T1j+b*T2j*T2j+x*T1j+y*T2j+z)%M;
T1j=T2j;
T2j=T3;
j+=2;
} while(T1i!=T1j||T2i!=T2j);
t0=j-i;
t1=i-1;
T11=T1i;
T22=T2i;
}
void rezolvare(unsigned long T1,unsigned long T2,unsigned long n)
{unsigned long i=2,T3;
freopen("rsir.out","w",stdout);
if(n==1)
{
printf("%lu",T1);
fclose(stdout);
return;
}
else if(n==2)
{printf("%lu",T2);
fclose(stdout);
return;
}
while(i<n)
{
T3=(a*T1*T1+b*T2*T2+x*T1+y*T2+z)%M;
T1=T2;
T2=T3;
i++;
}
printf("%lu",T2);
fclose(stdout);
return ;
}
int main()
{
citire();
gasire_ciclu();
if(n>t1)
{
n=(n-t1)%t0;
if(!n) n=t0;
rezolvare(T11,T22,n);
}
else
rezolvare(T0,T1,n+1);
return 0;
}