Cod sursa(job #2940981)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 16 noiembrie 2022 21:02:37
Problema Rsir Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.11 kb
#include<iostream>
#include<fstream>
using namespace std;

ifstream f("rsir.in");
ofstream g("rsir.out");

struct coord
{
    long long minus_one, minus_two;
};

long long t1,t2;
long long a,b;
long long x,y,z;
long long m,n;

long long nextNumber(long long tminusone,long long tminustwo)
{
    long long val = (a*(tminustwo*tminustwo) + b*(tminusone*tminusone) + x * tminustwo + y * tminusone + z)%m;  
    return val;
}

void solve()
{
    coord tortoise,hare;
    tortoise.minus_one = t2;
    tortoise.minus_two = t1;
    hare.minus_one = t2;
    hare.minus_two = t1;
    long long val1 = 0;
    long long val2 = 0;
    while(1)
    {
        swap(hare.minus_one,hare.minus_two);
        hare.minus_one = nextNumber(hare.minus_two,hare.minus_one);
        swap(hare.minus_one,hare.minus_two);
        hare.minus_one = nextNumber(hare.minus_two,hare.minus_one);
        swap(tortoise.minus_one,tortoise.minus_two);
        tortoise.minus_one = nextNumber(tortoise.minus_two,tortoise.minus_one);
        if(tortoise.minus_one == hare.minus_one && tortoise.minus_two == hare.minus_two)
        {
            val1 = tortoise.minus_one;
            val2 = tortoise.minus_two;
            break;
        }
    }
    long long cyclelen = 0;
    while(1)
    {
        cyclelen++;
        swap(tortoise.minus_one,tortoise.minus_two);
        tortoise.minus_one = nextNumber(tortoise.minus_two,tortoise.minus_one);
        if(tortoise.minus_one == val1 && tortoise.minus_two == val2)
            break;
    }
    tortoise.minus_one = t2;
    tortoise.minus_two = t1;
    long long length_before = 0;
    while(1)
    {
        length_before++;
        swap(tortoise.minus_one,tortoise.minus_two);
        tortoise.minus_one = nextNumber(tortoise.minus_two,tortoise.minus_one);
        if(tortoise.minus_one == val1 && tortoise.minus_two == val2)
            break;
    }
    hare.minus_one = t2;
    hare.minus_two = t1;
    long long pos = 2;
    cout<<length_before;
    while(length_before > 0 && pos < n)
    {
        length_before--;
        length_before--;
        pos++;
        pos++;
        swap(hare.minus_one,hare.minus_two);
        hare.minus_one = nextNumber(hare.minus_two,hare.minus_one);
        swap(hare.minus_one,hare.minus_two);
        hare.minus_one = nextNumber(hare.minus_two,hare.minus_one);
    }
    if(pos > n)
    {
        if(pos - n == -1)
            g<<hare.minus_two;
        else
            g<<hare.minus_one;
    }
    else
    {
        cyclelen = cyclelen % m;
        while(cyclelen > 0)
        {
            cyclelen--;
            cyclelen--;
            swap(hare.minus_one,hare.minus_two);
            hare.minus_one = nextNumber(hare.minus_two,hare.minus_one);
            swap(hare.minus_one,hare.minus_two);
            hare.minus_one = nextNumber(hare.minus_two,hare.minus_one);
        }
        if(cyclelen == -1)
            g<<hare.minus_two;
        else
            g<<hare.minus_one;
    }
}

void citire()
{
    f>>t1>>t2;
    f>>a>>b;
    f>>x>>y>>z;
    f>>m>>n;
}

int main()
{
    citire();
    solve();
}