Cod sursa(job #1644407)

Utilizator sebinechitasebi nechita sebinechita Data 9 martie 2016 22:58:56
Problema Rsir Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("rsir.in");
ofstream fout("rsir.out");

pair<int, int> rez[7010];

int main()
{
    int t0, t1, a, b, x, y, z, m, ix, iy, i, iz, ix2, iy2, iz2, j;
    long long n;
    int cn = n;
    fin >> t0 >> t1 >> a >> b >> x >> y >> z >> m >> n;
    t0 %= m;
    t1 %= m;
    ix = t0;
    ix2 = (ix * ix) % m;
    iy = t1;
    iy2 = (iy * iy) % m;
    for(i = 2 , j = 2; ; i++, j++)
    {
      //  cout << ix << " " << iy << "\n";
        iz = (a * ix2 + b * iy2 + x * ix + y * iy + z) % m;
        iz2 = (iz * iz) % m;
        ix = iy;
        ix2 = iy2;
        iy = iz;
        iy2 = iz2;
        if(j == m)
        {
            j = 0;
            rez[i / m] = make_pair(ix, iy);
        }
        if(ix == t0 && iy == t1)
            break;
    }
    i--;
    n %= i;
    cn = (int)n;
    if(cn == 0)
    {
        fout << t0 << "\n";
    }
    else if(cn == 1)
    {
        fout << t1 << '\n';
    }
    else
    {
        if(cn >= m)
        {
            ix = rez[cn / m].first;
            iy = rez[cn / m].second;
        }
        else
        {
            ix = t0;
            iy = t1;
        }
        ix2 = (ix * ix) % m;
        iy2 = (iy * iy) % m;
        for(i = (cn >= m) ? (cn - (cn % m)) : 2 ; i <= cn ; i++)
        {
            iz = (a * ix2 + b * iy2 + x * ix + y * iy + z) % m;
            iz2 = (iz * iz) % m;
            ix = iy;
            ix2 = iy2;
            iy = iz;
            iy2 = iz2;
        }
        fout << iz << "\n";
    }

}