Cod sursa(job #1680388)

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