Pagini recente » Cod sursa (job #1855755) | Cod sursa (job #2048825) | Cod sursa (job #2191018) | Cod sursa (job #2134474) | Cod sursa (job #1736500)
#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;
}