Cod sursa(job #198074)

Utilizator CezarMocanCezar Mocan CezarMocan Data 8 iulie 2008 13:01:01
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>

using namespace std;

long i,j,m,a,b,x,y,z,t0,t1,p1,p2,r1,r2,p,np,q1,q2,s1,s2,ac,nr;
long A[7010],B[7010];
long long n;

void urm(long &x1, long &x2)
    {
    long x3;
    x3=A[x1]+B[x2];
    if (x3>=m)
        x3-=m;
    x3+=z;
    if (x3>=m)
        x3-=m;
    x1=x2;x2=x3;            
    }

int main(){
freopen("rsir.in","r",stdin);
freopen("rsir.out","w",stdout);
scanf("%d%d%d%d%d%d%d%d%lld",&t0,&t1,&a,&b,&x,&y,&z,&m,&n);
for (i=0;i<m;i++)
    {
    A[i]=((1LL*i*i*a)%m+(1LL*i*x)%m)%m;
    B[i]=((1LL*i*i*b)%m+(1LL*i*y)%m)%m;    
    }
//cu p merg din 1 in 1 si cu r-ul merg din 2 in 2
p1=r1=q1=t0;
p2=r2=q2=t1;
do
    {
    urm(p1,p2);
//    printf("%d %d   ",p1,p2);
    urm(r1,r2);
    urm(r1,r2);
//    printf("%d %d\n",r1,r2);    
    p++;
    }
while ((p1!=r1)||(p2!=r2));
//printf("%d\n",p);
for (i=2;i<=p+1;i++)
    urm(t0,t1); 
//printf("%d %d\n",t0,t1);   
while ((t0!=q1)||(t1!=q2))
    {
    np++;
    urm(t0,t1);
    urm(q1,q2);    
    }
s1=q1;s2=q2;
//np--;
ac=(n-np)%p;
if (ac==0)
    ac=p;
nr=1;
while (nr<ac)
    {
    urm(s1,s2);
    nr++;    
    }
printf("%d\n",s2);
return 0;    
}