Cod sursa(job #68626)

Utilizator goguGogu Marian gogu Data 28 iunie 2007 18:33:46
Problema Rsir Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
#include <cmath>

using namespace std;

long long n;
unsigned t0, t1, a, b, x, y, z, MOD;

void modif(unsigned &t0, unsigned &t1)
{
     unsigned p0 = (t0*t0)%MOD, p1 = (t1*t1)%MOD, old = t1;
     t1 = (a*p0 + b*p1 + x*t0 + y*t1 + z)%MOD;
     t0 = old;
}

void brute(unsigned n)
{
     for (unsigned i=0; i<n; i++)
         modif(t0, t1);
     printf("%u\n", t0);
}

int main()
{
    unsigned i;
    freopen("rsir.in", "r", stdin);
    freopen("rsir.out", "w", stdout);
    scanf("%u %u %u %u %u %u %u %u %lld", 
                 &t0, &t1, &a, &b, &x, &y, &z, &MOD, &n);
    t0 %= MOD; t1 %= MOD;
    unsigned last = (MOD*MOD < (1<<20) ? (MOD*MOD) : (1<<20));
    if (n <= last){
       brute(n);
       return 0;
    }
    for (i=0; i<last; i++)
        modif(t0, t1);
    n-=last;
    unsigned T0 = t0, T1 = t1, lung = 1;
    modif(t0, t1);
    while (t0!=T0 || t1!=T1) modif(t0, t1), lung++;
    brute(n%lung);
    return 0;
}