Cod sursa(job #1678758)

Utilizator robx12lnLinca Robert robx12ln Data 7 aprilie 2016 15:22:33
Problema Rsir Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("rsir.in");
ofstream fout("rsir.out");
long long L, n, a, b, x, y, z, mod, L1;
pair<long long,long long> A, B;
pair<long long,long long>next( pair<long long,long long> nr ){
    pair<long long,long long> next_nr;
    next_nr.first = nr.second;
    next_nr.second = 1LL * a * nr.first * nr.first % mod + 1LL * b * nr.second * nr.second % mod + 1LL * x * nr.first % mod + 1LL * y * nr.second % mod + z;
    next_nr.second %= mod;
    return next_nr;
}
int main(){
    fin >> A.first >> A.second >> a >> b >> x >> y >> z >> mod >> n;
    if( n == 0 ){
        fout << A.first;
        return 0;
    }
    if( n == 1 ){
        fout << A.second;
        return 0;
    }
    pair<long long,long long> save = A;
    B = A;
    do{
        A = next( A );
        B = next( next( B ) );
    }while( A != B );
    B = save;
    L = 0;
    do{
        L++;
        B = next( B );
    }while( A != B );
    A = save;
    B = save;
    for( long long i = 1; i <= L; i++ ){
        B = next(B);
    }
    L1 = 0;
    while( A != B ){
        A = next(A);
        B = next(B);
        L1++;
    }
    if( n <= L1 ){
        A = save;
        for( long long i = 2; i <= n; i++ ){
            A = next(A);
        }
        fout << A.second;
    }else{
        n = ( n - L1 ) % L;
        if( n == 0 ){
            n = L;
        }
        A = save;
        for( long long i = 2; i <= L1; i++ ){
            A = next(A);
        }
        for( long long i = 1; i <= n; i++ ){
            A = next(A);
        }
        fout << A.first;
    }
    return 0;
}