Pagini recente » Cod sursa (job #1536846) | Cod sursa (job #209939) | Cod sursa (job #2073969) | Istoria paginii runda/provocarea_saptamanii/clasament | Cod sursa (job #741491)
Cod sursa(job #741491)
#include <cstdio>
#include <utility>
using namespace std;
const int kMaxM = 7005;
int a, b, x, y, z, n, T0, T1, M, v1[kMaxM], v2[kMaxM];
void next(pair <int, int> &a) {
int x = (v1[a.first] + v2[a.second] + z) % M;
a.second = a.first;
a.first = x;
}
void read() {
scanf("%d%d%d%d%d%d%d%d%d", &T0, &T1, &a, &b, &x, &y, &z, &M, &n);
}
void init() {
for (int i = 0; i < M; ++i)
v1[i] = (b * i + y * i) % M;
for (int i = 0; i < M; ++i)
v2[i] = (a * i + x * i) % 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;
while (p1 != p2) {
next(p1);
next(p2); next(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;
do {
next(p2);
++lcoada;
} while (p1 != p2);
// rezolv
p2.first = T1;
p2.second = T0;
--n;
for (int i = 1; i <= min(lcoada, n); ++i)
next(p2);
n -= lcoada;
if (n >= 0) {
n -= (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;
}