Cod sursa(job #88380)

Utilizator filipbFilip Cristian Buruiana filipb Data 1 octombrie 2007 22:39:05
Problema Rsir Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>

int T0, T1, T2, a, b, x, y, z, M, perioada, rst;
long long N;

int sqr(int X)
{ return (X * X) % M; }

int t_next(int t0, int t1)
{ return (a * sqr(t0) + b * sqr(t1) + x * t0 + y * t1 + z) % M; }

int main(void)
{
    int i, t0, t1, t2, tt0, tt1;
    
    freopen("rsir.in", "r", stdin);
    freopen("rsir.out", "w", stdout);

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

    if (M == 1) { printf("0\n"); return 0; }

    T0 %= M; T1 %= M;
    
    for (i = 1, t0 = T0, t1 = T1; i < M * M; i++)
    {
        t2 = t_next(t0, t1);
        t0 = t1; t1 = t2;        
    }

    for (i = 1, tt0 = T0, tt1 = T1; i < M * M; i++)
    {
        if (T0 == t0 && T1 == t1)
        {
            perioada = M * M - i;
            break;
        }
        
        T2 = t_next(T0, T1);
        T0 = T1; T1 = T2;
    }

    rst = i-1;

    if (N < rst)
    {
        for (i = 1, T0 = tt0, T1 = tt1; i < N; i++)
        {
            T2 = t_next(T0, T1);
            T0 = T1; T1 = T2;
        }
        printf("%d\n", T1);
    }
    else
    {
        N -= rst; N %= perioada;
        for (i = 1, T0 = t0, T1 = t1; i < N; i++)
        {
            T2 = t_next(T0, T1);
            T0 = T1; T1 = T2;
        }
        printf("%d\n", T1);        
    }
    
    return 0;
}