Cod sursa(job #1236438)

Utilizator geniucosOncescu Costin geniucos Data 1 octombrie 2014 22:17:53
Problema Rsir Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<cstdio>
#include<algorithm>

using namespace std;

int St, Dr, T0, T1, A, B, X, Y, Z, M;
long long n;

pair < int, int > cur, cur1, cur2;

pair < int , int > Nxt (pair < int , int > ceva)
{
    int pp, p;
    pp = ceva.first;
    p = ceva.second;
    return make_pair( p, ((long long)1LL*A*pp*pp + 1LL*B*p*p + X*pp + Y*p + Z) % M);
}

int brut (long long n)
{
    if (n==0) return T0;
    if (n==1) return T1;
    int p = 1;
    cur = make_pair (T0, T1);
    while (1)
    {
        cur = Nxt (cur);
        p++;
        if (p==n) return cur.second;
    }
}

int main()
{
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 (n <= M*M)
{
    printf ("%d\n", brut(n));
    return 0;
}
cur1 = make_pair(T0, T1);
cur2 = cur1;
St = 1;
while (1)
{
    cur1 = Nxt ( cur1 );
    St ++;
    cur2 = Nxt ( cur2 );
    cur2 = Nxt ( cur2 );
    if (cur1 == cur2) break;
}
cur2 = Nxt(cur1);
Dr = St + 1;
while (1)
{
    if (cur2 == cur1) break;
    Dr ++;
    cur2 = Nxt ( cur2 );
}

n = (n - St) % (Dr - St) + St;
printf ("%d\n", brut (n));
return 0;
}