Cod sursa(job #1275206)

Utilizator george_stelianChichirim George george_stelian Data 24 noiembrie 2014 21:02:17
Problema Rsir Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int a,b,x,y,z,mod,v1[7010],v2[7010];

pair<int,int> nextelement(pair<int,int> p)
{
    int t=p.first,t1=p.second;
    return make_pair(t1,(v1[t]+v2[t1])%mod);
}

int main()
{
    freopen("rsir.in", "r", stdin);
    freopen("rsir.out", "w", stdout);
    int t0,t1,nr1=0,nr2=0;
    long long n;
    scanf("%d%d%d%d%d%d%d%d%lld",&t0,&t1,&a,&b,&x,&y,&z,&mod,&n);
    t0%=mod;t1%=mod;
    if(n==0)
    {
        printf("%d",t0);
        return 0;
    }
    for(int i=0;i<=mod;i++)
    {
        v1[i]=(1LL*a*i*i+x*i+z)%mod;
        v2[i]=(1LL*b*i*i+y*i)%mod;
    }
    pair<int,int> p=make_pair(t0,t1),p1=make_pair(t0,t1);
    while(1)
    {
        nr1++;
        p=nextelement(p);
        p1=nextelement(nextelement(p1));
        if(p==p1) break;
    }
    if(n<=nr1)
    {
        p=make_pair(t0,t1);
        for(int i=2;i<=n;i++) p=nextelement(p);
        printf("%d",p.second);
        return 0;
    }
    while(1)
    {
        nr2++;
        p=nextelement(p);
        if(p==p1) break;
    }
    n=(n-nr1)%nr2;
    if(!n) n+=nr2;
    for(int i=2;i<=n;i++) p=nextelement(p);
    printf("%d",p.second);
    return 0;
}