Cod sursa(job #1236459)

Utilizator geniucosOncescu Costin geniucos Data 1 octombrie 2014 22:39:52
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<cstdio>
using namespace std;
int j,pr,nr2,i,l,nr,m,a,b,c,x,y,z,A[7005],B[7005],v[5];
long long n;
struct str
{
    int f,s;
};
str urm(str T)
{
    str rez;
    int a=A[T.f]+B[T.s];
    if(a>=m) a=a-m;
    rez.f=T.s;
    rez.s=a;
    return rez;
}
str p1,p2,t0,t1,t2;
int main()
{
freopen("rsir.in","r",stdin);
freopen("rsir.out","w",stdout);
scanf("%d",&t0.f);
scanf("%d",&t0.s);
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&x);
scanf("%d",&y);
scanf("%d",&z);
scanf("%d",&m);
scanf("%lld",&n);
for(i=0;i<m;i++)
{
    A[i]=((i*i)%m*a+i*x)%m;
    B[i]=((i*i)%m*b+i*y+z)%m;
}
nr=m*m+2;
t0.f=t0.f%m;
t0.s=t0.s%m;
t1=t0;
for(i=2;i<=nr;i++)
    t1=urm(t1);
t2=t1;
t1=t0;
nr2=0;
for(i=1;i<=nr;i++)
{
    if(t1.f==t2.f&&t1.s==t2.s)
    {
        nr2++;
        v[nr2]=i;
        if(nr2==2) break;
    }
    t1=urm(t1);
}
l=v[2]-v[1];
p1=t0;////pozitia 1
p2=t0;////pozitia 1 pe care o fac l+1
for(i=2;i<=l+1;i++)
    p2=urm(p2);
if(p1.f==p2.f&&p1.s==p2.s) pr=1;
for(i=2;i<=nr;i++)
{
    p1=urm(p1);
    p2=urm(p2);
    if(p1.f==p2.f&&p2.f==p2.s)
    {
        pr=i;
        break;
    }
}
/*t1=t0;
for(i=1;i<pr;i++)
{
    printf("%d ",t1.f);
    t1=urm(t1);
}
for(i=1;i<=30;i++)
{
    printf("\n");
    for(j=1;j<=l;j++)
    {
        printf("%d ",t1.f);
        t1=urm(t1);
    }
}
printf("\n");*/
//return 0;
//////pr-1 lungimea neperioadei
if(n<=pr-1)
{
    p1=t0;
    for(i=1;i<n;i++)
        p1=urm(p1);
    printf("%d\n",p1.s);
}
else
{
    n=n-pr+1;
    if(n%l==0) n=l;
    else n=n%l;
    n=n+pr-1;
    p1=t0;
    for(i=1;i<n;i++)
        p1=urm(p1);
    printf("%d\n",p1.s);
}
//printf("%d\n",l);
return 0;
}