Cod sursa(job #812206)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 13 noiembrie 2012 17:10:11
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>

#define MAX 7500
#define ll long long

using namespace std;

struct stare
{
    int ago[2];
}f, s, N;

int R0[MAX], R1[MAX], M, x, y, a, b, z, pas, coada, ciclu;
ll n, T0, T1;

void GoNext(stare &a)
{
    int aux = a.ago[1];
    a.ago[1] = R0[a.ago[0]] + R1[a.ago[1]] + z;
    while(a.ago[1] >= M) a.ago[1] -= M;
    a.ago[0] = aux;
}

void getVal(int pas, stare &v)
{
    v.ago[1] = T1 % M; v.ago[0] = T0 % M;
    for(int i = 1; i < pas; i++)
        GoNext(v);
}

void init()
{
    for(int i = 0; i < M; i++)
    {
        ll patrat = i * i;
        R0[i] = (patrat * a + x * i) % (ll)M;
        R1[i] = (patrat * b + y * i) % (ll)M;
    }
}


int main()
{
    ifstream in("rsir.in");
    in>>T0>>T1>>a>>b>>x>>y>>z>>M>>n;
    in.close();
    init();
    N.ago[0] = f.ago[0] = s.ago[0] = T0 % M;
    N.ago[1] = f.ago[1] = s.ago[1] = T1 % M;
    while(!pas || f.ago[0] != s.ago[0] || f.ago[1] != s.ago[1])
    {
        GoNext(s);
        GoNext(f);
        GoNext(f);
        pas++;
    }
    while(N.ago[0] != f.ago[0] || N.ago[1] != f.ago[1])
    {
        GoNext(N); GoNext(f);
        pas++;
        coada++;
    }
    ciclu = pas - coada;
    if(n <= coada)
        getVal(n, N);
    else
        getVal(coada + (n - coada) % ciclu, N);
    ofstream out("rsir.out"); out<<N.ago[1]; out.close();
    return 0;
}