Cod sursa(job #812151)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 13 noiembrie 2012 15:50:17
Problema Rsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>

#define MAX 7500

using namespace std;

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

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

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++)
    {
        int patrat = i * i;
        R0[i] = (a * patrat + x * i) % M;
        R1[i] = (b * patrat + y * i) % 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;
    ofstream out("rsir.out");
    while(!pas || (f.ago[0] != s.ago[0] && f.ago[1] != s.ago[1]))
    {
        //out<<pas<<": "<<s.ago[0]<<" "<<s.ago[1]<<"\n";
        GoNext(s);
        GoNext(f);//out<<"   "<<f.ago[0]<<" "<<f.ago[1]<<"\n";
        if(pas && f.ago[0] == s.ago[0] && f.ago[1] == s.ago[1]) break;
        GoNext(f);//out<<"   "<<f.ago[0]<<" "<<f.ago[1]<<"\n";
        pas++;
        if(pas > 10000) break;
    }
    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 + 1, N);
    out<<N.ago[1]; out.close();
    return 0;
}