Cod sursa(job #1678797)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 7 aprilie 2016 15:35:36
Problema Rsir Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <bits/stdc++.h>

const int DIM = 1 << 13;
using namespace std;

long long N; int V1[DIM], V2[DIM];
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 = V1[val1] + V2[val2] + e;

        if( val3 >= MOD ) val3 -= MOD;
        if( val3 >= MOD ) val3 -= 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 );

    for( int i = 0; i < M; i ++ ) {
        V1[i] = ( 1LL * a * i * i + c * i ) % M;
        V2[i] = ( 1LL * b * i * i + d * i ) % 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;
}