Cod sursa(job #1678781)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 7 aprilie 2016 15:31:35
Problema Rsir Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <bits/stdc++.h>
using namespace std;

long long N; int a, b, c, d, e, M, val1, val2, len, tail;

struct node {;
    int val1, val2, a, b, c, d, e, MOD;

    node( int _a, int _b, int _c, int _d, int _e, int _MOD ) {
        a = _a; b = _b; c = _c; d = _d; e = _e;
        MOD = _MOD; val1 = 0; val2 = 0;
    }

    void set_node( int _val1, int _val2 ) {
        val1 = _val1; val2 = _val2;

        return;
    }

    void next_node() {
        int val3 = ( 1LL * a * val1 * val1 + 1LL * b * val2 * val2 + c * val1 + d * val2 + e ) % MOD;
        val1 = val2; val2 = val3;

        return;
    }
};

int main() {

    FILE *input_file  = fopen( "rsir.in" , "r" );
    FILE *output_file = fopen( "rsir.out", "w" );

    fscanf( input_file, "%d %d %d %d %d %d %d %d %lld", &val1, &val2, &a, &b, &c, &d, &e, &M, &N );
    a %= M; b %= M; c %= M; d %= M; e %= M; val1 %= M; val2 %= M;
    node A( a, b, c, d, e, M ), B( a, b, c, d, e, M ), C( a, b, c, d, e, M );

    if( N == 0 )
        fprintf( output_file, "%d\n", val1 );
    else {
        A.set_node( val1, val2 );
        B.set_node( val1, val2 );

        do {
            A.next_node();
            B.next_node();
            B.next_node();
        } while( A.val1 != B.val1 || A.val2 != B.val2 );

        do {
            len ++;
            A.next_node();
        } while( A.val1 != B.val1 || A.val2 != B.val2 );

        A.set_node( val1, val2 );
        B.set_node( val1, val2 );

        for( int i = 1; i <= len; i ++ )
            B.next_node();

        while( A.val1 != B.val1 || A.val2 != B.val2 ) {
            tail ++;
            A.next_node();
            B.next_node();
        }

        if( N < tail ) {
            A.set_node( val1, val2 );

            for( int i = 1; i <= N; i ++ )
                A.next_node();
        } else {
            N = ( N - tail ) % len;

            for( int i = 1; i <= N; i ++ )
                A.next_node();
        }

        fprintf( output_file, "%d\n", A.val1 );
    }

    return 0;
}