Cod sursa(job #1736500)

Utilizator akaprosAna Kapros akapros Data 1 august 2016 20:51:31
Problema Rsir Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <bits/stdc++.h>
#define maxN 7002
#define ll long long
using namespace std;
int k, p, ans, t0, t1, a, b, x, y, z, sqra[maxN], sqrb[maxN], mod;
ll n;
void read()
{
    int i;
    freopen("rsir.in", "r", stdin);
    scanf("%d %d %d %d %d %d %d %d %lld", &t0, &t1, &a, &b, &x, &y, &z, &mod, &n);
    z %= mod;
    t0 %= mod;
    t1 %= mod;
    sqrb[0] = z;
    for (i = 1; i < mod; ++ i)
    {
        sqra[i] = (a * ((i * i) % mod) + x * i) % mod;
        sqrb[i] = (b * ((i * i) % mod) + y * i + z) % mod;
    }
}

void prec()
{
    int f2 = t1, s2 = t1, f1 = t0, s1 = t0, aux;
    do
    {
        aux = f2;
        f2 = sqra[f1] + sqrb[f2];
        if (f2 >= mod)
            f2 -= mod;
        f1 = aux;
        aux = s2;
        s2 = sqra[s1] + sqrb[s2];
        if (s2 >= mod)
            s2 -= mod;
        s1 = aux;
        aux = s2;
        s2 = sqra[s1] + sqrb[s2];
        if (s2 >= mod)
            s2 -= mod;
        s1 = aux;
    }
    while (f2 != s2 || f1 != s1);
    int F1 = f1, F2 = f2;
    aux = f2;
    f2 = sqra[f1] + sqrb[f2];
    if (f2 >= mod)
        f2 -= mod;
    f1 = aux;
    p = 1;
    while (f2 != F2 || f1 != F1)
    {
        ++ p;
        int aux = f2;
        aux = f2;
        f2 = sqra[f1] + sqrb[f2];
        if (f2 >= mod)
            f2 -= mod;
        f1 = aux;
    }
    f1 = t0;
    f2 = t1;

    do
    {
        aux = f2;
        aux = f2;
        f2 = sqra[f1] + sqrb[f2];
        if (f2 >= mod)
            f2 -= mod;
        f1 = aux;

        for (int i = 1; i <= p; ++ i)
        {
            aux = s2;
            s2 = sqra[s1] + sqrb[s2];
            if (s2 >= mod)
                s2 -= mod;
            s1 = aux;
        }
    }
    while (f2 != s2 || f1 != s1);

    F1 = f1;
    F2 = f2;
    f1 = t0;
    f2 = t1;
    k = 2;
    while (f2 != F2 || f1 != F1)
    {
        ++ k;
        aux = f2;
        aux = f2;
        aux = f2;
        f2 = sqra[f1] + sqrb[f2];
        if (f2 >= mod)
            f2 -= mod;
        f1 = aux;
    }
}
void solve()
{
    int aux;
    ll pos = n;
    if (n > 1)
    {
        prec();
        if (pos > k)
            pos = k - 1 + (pos - k + 1) % p;
        if (pos == 0)
            ans = t0;
        else if (pos == 1)
            ans = t1;
        else
        {
            while (-- pos)
            {
                aux = t1;
                t1 = sqra[t0] + sqrb[t1];
                if (t1 >= mod)
                    t1 -= mod;
                t0 = aux;
            }
            ans = t1;
        }
    }
    else
    {
        if (n == 0)
            ans = t0;
        else if (n == 1)
            ans = t1;
    }
}
void write()
{
    freopen("rsir.out", "w", stdout);
    printf("%d\n", ans);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}