Cod sursa(job #2957944)

Utilizator indmium_Voicu Buhai Imperiu indmium_ Data 23 decembrie 2022 20:09:39
Problema Rsir Scor 0
Compilator cpp-64 Status done
Runda 49maimare48 Marime 1.55 kb
#include <iostream>
#include <fstream>

#define int long long

using namespace std;

ifstream fin("rsir.in");
ofstream fout("rsir.out");

const int MODMAX = 7000;

int T0, T1;
int a, b, x, y, z, mod, n;

void advance(int &A, int &B){
    int C = (a * A * A + b * B * B + x * A + y * B + z) % mod;
    A = B;
    B = C;
}

signed main(){
    fin >> T0 >> T1;
    fin >> a >> b >> x >> y >> z >> mod >> n;

    T0 %= mod;
    T1 %= mod;

    int T2 = T0;
    int T3 = T1;

    advance(T2, T3);
    advance(T2, T3);

    int slow = 1;
    int fast = 2;

    int prevSlowVal = T1;
    int slowVal = T2;

    int prevFastVal = T2;
    int fastVal = T3;

    while(slowVal != fastVal && prevSlowVal != prevFastVal){
        ++slow;
        advance(prevSlowVal, slowVal);

        ++fast;
        ++fast;
        advance(prevFastVal, fastVal);
        advance(prevFastVal, fastVal);
    }

    int cycLen = slow;

    slow = 0;
    prevSlowVal = T0;
    slowVal = T1;

    while(slowVal != fastVal && prevSlowVal != prevFastVal){
        ++slow;
        advance(prevSlowVal, slowVal);

        ++fast;
        advance(prevFastVal, fastVal);
    }

    int tailLen = slow;

    n = (n + 1 - tailLen) % cycLen + tailLen - 1;

    if(n == 0){
        fout << T0 << '\n';
    }else if(n == 1){
        fout << T1 << '\n';
    }else{
        for(int i = 1; i < n; i++){
            advance(T0, T1);
        }
        fout << T1 << '\n';
    }

    if(cycLen < 10000){
        return 69;
    }

    return 0;
}