Cod sursa(job #1275209)

Utilizator george_stelianChichirim George george_stelian Data 24 noiembrie 2014 21:05:56
Problema Rsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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=v1[p.first]+v2[p.second];
    if(t>=mod) t-=mod;
    return make_pair(p.second,t);
}

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++;
        if(n==nr1)
        {
            printf("%d",p.second);
            return 0;
        }
        p=nextelement(p);
        p1=nextelement(nextelement(p1));
        if(p==p1) break;
    }
    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;
}