Cod sursa(job #1736519)

Utilizator akaprosAna Kapros akapros Data 1 august 2016 21:45:31
Problema Rsir Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 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] = (1LL * a * i * i + 1LL * x * i) % mod;
        sqrb[i] = (1LL * b * i * i + 1LL * y * i + 1LL * z) % mod;
    }
}
void T(int &t0, int &t1)
{
    int aux = t1;
    t1 = sqra[t0] + sqrb[t1];
    if (t1 >= mod)
        t1 -= mod;
    t0 = aux;
}
void prec()
{
    int f2 = t1, s2 = t1, f1 = t0, s1 = t0, i = 1, j = 1, F1, F2;
    do
    {
        ++ i;
        j += 2;
        T(f1, f2);
        T(s1, s2);
        T(s1, s2);
    }
    while (f2 != s2 || f1 != s1);
    p = j - i;
    f1 = t0;
    f2 = t1;

    do
    {
        T(f1, f2);
        for (int i = 1; i <= p; ++ i)
        {
            T(s1, s2);
        }
    }
    while (f2 != s2 || f1 != s1);

    F1 = f1;
    F2 = f2;
    f1 = t0;
    f2 = t1;
    k = 2;
    while (f2 != F2 || f1 != F1)
    {
        ++ k;
        T(f1, f2);
    }
}
void solve()
{
    ll pos = n;
    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)
        {
            T(t0, t1);
        }
        ans = t1;
    }
}
void write()
{
    freopen("rsir.out", "w", stdout);
    printf("%d\n", ans);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}