Cod sursa(job #1093578)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 28 ianuarie 2014 11:56:02
Problema Rsir Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <algorithm>

#define x first
#define y second
#define NMAX 7007
#define LL long long
#define shi short int

using namespace std;

int a, b, x, y, z;
LL M, n;
shi A[NMAX], B[NMAX];

pair< shi, shi > Next(pair< shi, shi > P){
    int Sum = A[P.x] + B[P.y];
    if(Sum > M)
        Sum -= M;
    return make_pair(P.y, Sum);
}

int main(){
    pair< shi, shi > P;
    freopen("rsir.in", "r", stdin);
    freopen("rsir.out", "w", stdout);
    scanf("%d %d %d %d %d %d %d %lld %lld", &P.x, &P.y, &a, &b, &x, &y, &z, &M, &n);
    if(n == 0){
        printf("%d\n", P.x);
        return 0;
    }
    if(n == 1){
        printf("%d\n", P.y);
        return 0;
    }
    P.x %= M;
    P.y %= M;
    for(int i = 0; i < M; ++i){
        int k = (i * i) % M;
        A[i] = (a * k + x * i) % M;
        B[i] = (b * k + y * i + z) % M;
    }
    pair< shi, shi > T = P, R = P;
    R = Next(Next(R));
    T = Next(T);
    while(R != T){
        R = Next(Next(R));
        T = Next(T);
    }
    pair< shi, shi > Cicle = T;
    int Ciclu = 1;
    R = Next(R);
    while(T != R){
        ++ Ciclu;
        R = Next(R);
    }
    while(n > 1 && T != Cicle)
        T = Next(T);
    if(n > 1)
        n %= Ciclu;
    while(n > 1){
        -- n;
        T = Next(T);
    }
    printf("%d", T.y);
    return 0;
}