Cod sursa(job #1936649)

Utilizator delia_99Delia Draghici delia_99 Data 23 martie 2017 11:41:19
Problema Rsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>

using namespace std;

const int NMAX=7000;

int t0,t1,a,b,x,y,z,m,n,i;
int ind1,ind11,ind2,ind22,strt,l;
int c1[NMAX+5],c2[NMAX+5];

int modd(long long x)
{
    if(x>m)
        x%=m;
    return (int)x;
}

int adv(int &t0,int &t1)
{
    int t2;
    t2=modd(1LL*c1[t0]+1LL*c2[t1]+1LL*z);
    return t2;
}

void advn()
{
    ind1=t0;
    ind11=t1;
    while(n--)
    {
        int ind3=ind11;
        ind11=adv(ind1,ind11);
        ind1=ind3;
    }
    printf("%d\n",ind1);
}

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);

    t0=modd(1LL*t0);
    t1=modd(1LL*t1);
    for(i=0; i<m; ++i)
    {
        c1[i]=modd(1LL*i*i*a+1LL*i*x);
        c2[i]=modd(1LL*i*i*b+1LL*i*y);
    }

    ind1=ind2=t0;
    ind11=ind22=t1;
    do
    {
        int ind3=ind11;
        ind11=adv(ind1,ind11);
        ind1=ind3;
        ind2=adv(ind2,ind22);
        ind22=adv(ind22,ind2);
    }
    while(!(ind1==ind2 && ind11==ind22));
    ///multiplu

    ind1=t0;
    ind11=t1;
    while(!(ind1==ind2 && ind11==ind22))
    {
        int ind3=ind11;
        ind11=adv(ind1,ind11);
        ind1=ind3;

        ind3=ind22;
        ind22=adv(ind2,ind22);
        ind2=ind3;
        ++strt;
    }///poz inceput

    ind2=ind1;
    ind22=ind11;
    do
    {
        int ind3=ind22;
        ind22=adv(ind2,ind22);
        ind2=ind3;
        ++l;
    }
    while(!(ind1==ind2 && ind11==ind22));
    ///lungime interval

    if(n<strt)
    {
        advn();
        return 0;
    }

    n=strt+(n-strt)%l;
    advn();
    return 0;
}