Pagini recente » Cod sursa (job #1668619) | Cod sursa (job #1573287) | Cod sursa (job #2966868) | Cod sursa (job #499206) | Cod sursa (job #741522)
Cod sursa(job #741522)
#include <cstdio>
#include <utility>
using namespace std;
const int kMaxM = 7005;
int a, b, x, y, z, T0, T1, M, v1[kMaxM], v2[kMaxM];
long long n;
void next(pair <int, int> &a) {
int x = v1[a.first] + v2[a.second];
if (x >= M)
x -= M;
a.second = a.first;
a.first = x;
}
void read() {
scanf("%d%d%d%d%d%d%d%d%lld", &T0, &T1, &a, &b, &x, &y, &z, &M, &n);
T0 %= M;
T1 %= M;
}
void init() {
for (int i = 0; i < M; ++i)
v1[i] = (b * (i * i) % M + y * i) % M;
for (int i = 0; i < M; ++i)
v2[i] = (a * (i * i) % M + x * i + z) % M;
}
inline int min(int x, int y) {
return x < y ? x : y;
}
void solve() {
pair <int, int> p1, p2;
p1.first = p2.first = T1;
p1.second = p2.second = T0;
do {
next(p1);
next(p2); next(p2);
} while (p1 != p2);
// determin lungimea ciclului
int lciclu = 0;
do {
next(p2);
++lciclu;
} while (p1 != p2);
// determin lungimea unei cozi posibile
int lcoada = 0;
p2.first = T1;
p2.second = T0;
while (p1 != p2) {
next(p2);
++lcoada;
}
fprintf(stderr, "%d %d\n", lcoada, lciclu);
// rezolv
p2.first = T1;
p2.second = T0;
--n;
for (int i = 1; i <= min(n, lcoada); ++i)
next(p2);
n -= 1LL * lcoada;
if (n > 0) {
n -= 1LL * (n / lciclu) * lciclu;
for (int i = 1; i <= n; ++i)
next(p2);
}
printf("%d\n", p2.first);
}
int main() {
freopen("rsir.in", "r", stdin);
freopen("rsir.out", "w", stdout);
read();
init();
solve();
return 0;
}