Cod sursa(job #2957911)

Utilizator indmium_Voicu Buhai Imperiu indmium_ Data 23 decembrie 2022 19:33:14
Problema Rsir Scor 10
Compilator cpp-64 Status done
Runda 49maimare48 Marime 1.71 kb
// this program should not work!!! 
#include <iostream>
#include <fstream>

#define int long long

using namespace std;

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

const int MODMAX = 7000;

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

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

signed main(){

    fin >> T1 >> T2;
    fin >> a >> b >> x >> y >> z >> mod >> n, --n;

    T1 %= mod;
    T2 %= mod;

    int slow = 2;
    int fast = 3;

    int prevSlowVal = T1;
    int slowVal = T2;

    int prevFastVal = T2;
    int fastVal = ((a * T1 * T1) % mod + (b * T2 * T2) % mod + (x * T1) % mod + (y * T2) % mod + z) % mod;

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

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

    int cycLen = fast - slow;

    slow = 1;
    slowVal = T1;

    while(slowVal != fastVal){
        ++slowVal;
        if(slow == 2){
            slowVal = T2;
            prevSlowVal = T1;
        }else{
            advance(prevSlowVal, slowVal);
        }

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

    int tailLen = slow - 1;

    if(n > tailLen){
        n -= tailLen;

        n %= cycLen;
        if(n == 0)
            n = cycLen;

        n += tailLen;
    }

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

    return 0;
}