Cod sursa(job #2957946)

Utilizator indmium_Voicu Buhai Imperiu indmium_ Data 23 decembrie 2022 20:15:41
Problema Rsir Scor 0
Compilator cpp-64 Status done
Runda 49maimare48 Marime 1.74 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;

int advance(int A, int B){
    return (a * A * A + b * B * B + x * A + y * B + z) % mod;
}

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

    T0 %= mod;
    T1 %= mod;

    int T2 = advance(T0, T1);
    int T3 = advance(T1, T2);

    int slow = 1;
    int fast = 2;

    int prevSlowVal = T1;
    int slowVal = T2;

    int prevFastVal = T2;
    int fastVal = T3;

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

        int aux;
        aux = advance(prevSlowVal, slowVal);
        prevSlowVal = slowVal;
        slowVal = aux;

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

    int cycLen = slow;

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

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

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

    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++){
            int aux = advance(T0, T1);
            T0 = T1;
            T1 = aux;
        }
        fout << T1 << '\n';
    }

    return 0;
}