Cod sursa(job #2237272)

Utilizator patcasrarespatcas rares danut patcasrares Data 1 septembrie 2018 12:55:51
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<fstream>
#include<bitset>
#define DN 7005
#define x first
#define y second
using namespace std;
ifstream fin("rsir.in");
ofstream fout("rsir.out");
int l,t0,t1,a,b,c,d,e,M,t2,t3,nr,l0,l1,f,poz;
long long n;
int r0[DN],r1[DN];
pair<int,int>p0,p1;
pair<int,int>ve(pair<int,int>p)
{
    int f=r0[p.x]+r1[p.y];
    if(f>=M)
        f-=M;
    return {p.y,f};
}
int solve(int poz)
{
    p0={t0,t1};
    for(int i=2;i<=poz;i++)
        p0=ve(p0);
    return p0.y;
}
int main()
{
    fin>>t0>>t1>>a>>b>>c>>d>>e>>M>>n;
    if(n==0)
    {
        fout<<t0;
        return 0;
    }
    for(int i=0;i<M;i++)
    {
        r0[i]=(a*((i*i)%M)+c*i)%M;
        r1[i]=(b*((i*i)%M)+d*i+e)%M;
    }
    p0={t0,t1};
    p0=ve(p0);
    p1=ve(p0);
    while(p0!=p1)
    {
        p0=ve(p0);
        p1=ve(ve(p1));
    }
    p0={t0,t1};
    poz=1;
    while(p0!=p1)
    {
        p0=ve(p0);
        poz++;
    }
    l=1;
    p0=ve(p0);
    while(p0!=p1)
    {
        p0=ve(p0);
        l++;
    }
    n-=poz;
    n=n%l;
    if(n==0)
        n=l;
    f=poz+n;
    fout<<solve(f);
}