Cod sursa(job #1389591)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 16 martie 2015 13:58:40
Problema Rsir Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
using namespace std;
ifstream f("rsir.in");
ofstream g("rsir.out");
long long T0,T1,a,b,x,y,z,M,N,Mod0[7005],Mod1[7005];
pair <int,int> succ(pair <int,int> p)
{
    long long T0=p.first,T1=p.second;
    int aux=T1;
    T1=Mod0[T0]+Mod1[T1];
    if(T1>=M)
        T1-=M;
    T0=aux;
    return make_pair(T0,T1);
}
void Solve()
{
    T0%=M;
    T1%=M;
    a%=M;
    b%=M;
    x%=M;
    y%=M;
    z%=M;
    for(int i=0;i<M;i++)
    {
        Mod0[i]=(i*i*a+x*i+z)%M;
        Mod1[i]=(i*i*b+y*i)%M;
    }
    pair <int,int> tortoise=succ(make_pair(T0,T1));
    pair <int,int> hare=succ(succ(make_pair(T0,T1)));
    while(tortoise!=hare)
    {
        tortoise=succ(tortoise);
        hare=succ(succ(hare));
    }
    int first=1;
    tortoise=make_pair(T0,T1);
    while(tortoise!=hare)
    {
        tortoise=succ(tortoise);
        hare=succ(hare);
        first++;
    }
    int last=2;
    hare=succ(tortoise);
    while(tortoise!=hare)
    {
        hare=succ(hare);
        last++;
    }
    if(N<last)
    {
        tortoise=make_pair(T0,T1);
        for(int i=2;i<=N;i++)
            tortoise=succ(tortoise);
        g<<tortoise.second<<"\n";
        return;
    }
    int diff=last-first;
    N=N-last+1;
    N%=diff;
    for(int i=2;i<=N;i++)
    {
        hare=succ(hare);
    }
    g<<hare.second<<"\n";
}
int main()
{
    f>>T0>>T1>>a>>b>>x>>y>>z>>M>>N;
    Solve();
    return 0;
}