Cod sursa(job #1305269)

Utilizator atatomirTatomir Alex atatomir Data 29 decembrie 2014 17:55:17
Problema Rsir Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <cstdio>

using namespace std;

long long a,b,x,y,z,mod,n;

struct State{
    long long t0,t1;

    State getNext(){
        State ans;
        ans.t0 = t1;
        ans.t1 = a*t0*t0 + b*t1*t1 + x*t0 + y*t1 + z;
        ans.t1 %= mod;
        return ans;
    }
    State getNextNext(){
        State ans = getNext();
        return ans.getNext();
    }
    bool operator!=(State tmp){
        return (tmp.t0 != t0)||(tmp.t1 != t1);
    }
};

State p1,p2,beg;
long lC,lCic;

int main()
{
    freopen("rsir.in","r",stdin);
    freopen("rsir.out","w",stdout);

    scanf("%lld %lld %lld %lld %lld %lld %lld %lld %lld",&p1.t0,&p1.t1,&a,&b,&x,&y,&z,&mod,&n);
    p1.t1 %= mod; p1.t0 %= mod; beg = p1;

    p2 = p1.getNext(); lCic = 1;
    while(p1 != p2){
        p1 = p1.getNext();
        p2 = p2.getNextNext();
        lCic++;
    }

    p1 = beg; lC = 0; p2 = p2.getNext();
    while(p1 != p2) {
        p1 = p1.getNext();
        p2 = p2.getNext();
        lC++;
    }

    if(n <= lC){
        for(long i = 2;i<=n;i++) beg = beg.getNext();
        printf("%ld",beg.t1);
    } else {
        n -= lC; n%=lCic; if(!n) n = lCic;
        for(long i = 2;i<=n;i++)
            p1 = p1.getNext();
        printf("%ld",p1.t1);
    }

    return 0;
}