Cod sursa(job #2159224)

Utilizator silkMarin Dragos silk Data 10 martie 2018 20:14:44
Problema Rsir Scor 60
Compilator cpp Status done
Runda lot_bossi Marime 1.69 kb
#include <bits/stdc++.h>
#define x first
#define y second
#define MaxN 100000
#define int64 long long
using namespace std;

bitset<6400> deja[6400];
int T[MaxN+1][2];

int main(){
    FILE* fin = fopen("rsir.in","r");
    FILE* fout = fopen("rsir.out","w");

    int i,T0,T1,Tx,Ty,Tz,a,b,x,y,z,P,M,f1,f2,ff,w;
    int64 N;

    fscanf(fin,"%d%d %d%d %d%d%d %d %lld",&T0,&T1,&a,&b,&x,&y,&z,&M,&N);
    T0 = T0 % M;
    T1 = T1 % M;

    deja[T0][T1] = 1;
    T[0][0] = T0;
    T[0][1] = T1;
    Tx = T0;
    Ty = T1;

    for(P = 2; P <= M * M; ++P)
    {
        Tz = (a * (1LL * Tx * Tx) % M + b * (1LL * Ty * Ty) % M + (x * Tx) + (y * Ty) + z) % M;
        Tx = Ty;
        Ty = Tz;

        if(P % 500 == 0) T[P / 500][0] = Tx, T[P / 500][1] = Ty;
        if(deja[Tx][Ty]) { f1 = Tx; f2 = Ty; break; }
        deja[Tx][Ty] = 1;
    }

    if(f1 == T0 && f2 == T1) ff = 1;
    else
    {
        Tx = T0;
        Ty = T1;
        for(w = 2; w <= M * M; ++w)
        {
            Tz = (a * (1LL * Tx * Tx) % M + b * (1LL * Ty * Ty) % M + (x * Tx) + (y * Ty) + z) % M;
            Tx = Ty;
            Ty = Tz;
            if(Tx == f1 && Ty == f2) { ff = w; break; }
        }
    }

    int pos, remain;

    P = P - ff;
    N = ff - 1 + (N - ff + 1) % P;
    if(ff == 1 && !N && N < 500) { fprintf(fout, "%d\n", T[0][0]); return 0; }

    pos = N / 500;
    remain = N % 500;

    Tx = T[pos][0];
    Ty = T[pos][1];
    if(!pos) --remain;
    while(remain--)
    {
        Tz = (a * (1LL * Tx * Tx) % M + b * (1LL * Ty * Ty) % M + (x * Tx) + (y * Ty) + z) % M;
        Tx = Ty;
        Ty = Tz;
    }

    fprintf(fout, "%d\n", Ty);


return 0;
}