Cod sursa(job #3000875)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 13 martie 2023 00:56:46
Problema Rsir Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.02 kb
#include<iostream>
#include<fstream>
using namespace std;

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

struct coord
{
    int minus_one, minus_two;
};

int t1,t2;
int a,b;
int x,y,z;
int m;
int val;
int precalc1[7005],precalc2[7005];
long long n;

inline int nextNumber(int &tminusone,int &tminustwo)
{
    val = precalc1[tminustwo] + precalc2[tminusone];

    if(val >= m)
        val = val - m;

    return val;
}

void precalc()
{
    t1 = t1 % m; t2 = t2 % m; a = a % m; b = b % m; x = x % m; y = y % m; z = z % m;
    long long sum;
    for(int i=0;i<m;i++)
    {
        sum = 1LL* a * i * i + 1LL * x * i + 1LL * z; 
        sum %= m;
        precalc1[i] = sum;
        sum =  1LL * b * i * i + 1LL* y * i;
        sum %= m;
        precalc2[i] = sum;
    }
}

void solve()
{
    coord tortoise,hare;
    tortoise.minus_one = t2;
    tortoise.minus_two = t1;
    hare.minus_one = t2;
    hare.minus_two = t1;
    int val1 = 0;
    int 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;
    }
    cout<<cyclelen<<" "<<length_before;
    tortoise.minus_one = t2;
    tortoise.minus_two = t1;
    long long pos = n-1;
    length_before = length_before-1;
    while(length_before > 0 && pos > 0)
    {
        length_before--;
        pos--;
        swap(tortoise.minus_one,tortoise.minus_two);
        tortoise.minus_one = nextNumber(tortoise.minus_two,tortoise.minus_one);
    }
    n = n % cyclelen;
    while(n > 0 && pos>0)
    {
        n--;
        pos--;
        swap(tortoise.minus_one,tortoise.minus_two);
        tortoise.minus_one = nextNumber(tortoise.minus_two,tortoise.minus_one);
    }
    g<<tortoise.minus_one;
}

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

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