Pagini recente » Cod sursa (job #2074412) | Cod sursa (job #989983) | Cod sursa (job #465969) | Cod sursa (job #2010875) | Cod sursa (job #1821712)
#include <cstdio>
#define LL long long
using namespace std;
//ifstream cin ("rsir.in");
//ofstream cout ("rsir.out");
const int MaxM = 7005;
LL t0, t1, a, b, x, y, z, M, n, tprev, tcurr, tprev2, tcurr2, CycleLength = 1;
LL A[MaxM], B[MaxM];
inline void NextElement(LL &tm2, LL &tm1) {
LL NewT = A[tm2] + B[tm1] + z;
while (NewT >= M) {
NewT -= M;
}
tm2 = tm1;
tm1 = NewT;
}
int main() {
freopen("rsir.in", "r", stdin);
freopen("rsir.out", "w", stdout);
//cin >> t0 >> t1 >> a >> b >> x >> y >> z >> M >> n;
scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d", &t0, &t1, &a, &b, &x, &y, &z, &M, &n);
for (int i = 0; i < M; ++i) {
A[i] = (a * i * i + x * i) % M;
B[i] = (b * i * i + y * i) % M;
}
t0 %= M;
t1 %= M;
tprev = t0;
tcurr = t1;
for (CycleLength = 0; CycleLength < n and CycleLength < M * M; ++CycleLength) {
NextElement(tprev, tcurr);
}
if (CycleLength == n) {
//cout << tprev << '\n';
printf("%I64d\n", tprev);
return 0;
}
n -= CycleLength;
CycleLength = 0;
tprev2 = tprev;
tcurr2 = tcurr;
do {
NextElement(tprev2, tcurr2);
++CycleLength;
} while (tprev2 != tprev or tcurr2 != tcurr);
n %= CycleLength;
for (int i = 1; i < n; ++i) {
NextElement(tprev, tcurr);
}
//cout << tcurr << '\n';
printf("%I64d\n", tcurr);
return 0;
}