Cod sursa(job #851232)

Utilizator visanrVisan Radu visanr Data 9 ianuarie 2013 19:02:56
Problema Rsir Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;

#define ll long long
#define Nmax 8000

struct State
{
    int First, Second;
}Start, One, Two, Ans;

int PrecA[Nmax], PrecB[Nmax], M, X, Y, A, B, Z;
int Steps, Cycle_Length, Tail_Length;
ll N, FirstT, SecondT;

void Advance(State &Now, int Steps)
{
    for(; Steps; Steps --)
    {
        int AuxN = Now.Second;
        Now.Second = PrecA[Now.First] + PrecB[Now.Second] + Z;
        while(Now.Second >= M) Now.Second -= M;
        Now.First = AuxN;
    }
}

void GetAns(State &Now, int Steps)
{
    Now.First = FirstT % M;
    Now.Second = SecondT % M;
    --Steps;
    for(; Steps; Steps --)
        Advance(Now, 1);
}

int main()
{
    int i;
    ifstream cin("rsir.in");
    ofstream cout("rsir.out");
    cin >> FirstT >> SecondT >> A >> B >> X >> Y >> Z >> M >> N;
    for(i = 0; i < M; i++)
    {
        ll Now = i * i;
        PrecA[i] = 1LL * (Now * A + i * X) % M;
        PrecB[i] = 1LL * (Now * B + i * Y) % M;
    }
    Start.First = One.First = Two.First = FirstT % M;
    Start.Second = One.Second = Two.Second = SecondT % M;
    while(!Steps || One.First != Two.First || One.Second != Two.Second)
        Advance(One, 1), Advance(Two, 2), Steps ++;
    while(Start.First != One.First || Start.Second != One.Second)
        Advance(Start, 1), Advance(One, 1), Steps ++, Tail_Length ++;
    Cycle_Length = Steps - Tail_Length;
    if(N <= Tail_Length) GetAns(Ans, N);
    else GetAns(Ans, Tail_Length + (N - Tail_Length) % Cycle_Length);
    cout << Ans.Second;
    return 0;
}