#include #define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i)) #define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i)) #define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i)) #define REP3R(i, m, n) for (int i = (int)(n) - 1; (i) >= (int)(m); -- (i)) #define ALL(x) std::begin(x), std::end(x) #define dump(x) cerr << #x " = " << x << endl using namespace std; template using reversed_priority_queue = priority_queue, greater >; template inline void chmax(T & a, U const & b) { a = max(a, b); } template inline void chmin(T & a, U const & b) { a = min(a, b); } template auto make_table(X x, T a) { return vector(x, a); } template auto make_table(X x, Y y, Z z, Zs... zs) { auto cont = make_table(y, z, zs...); return vector(x, cont); } template ostream & operator << (ostream & out, vector const & xs) { REP (i, (int)xs.size() - 1) out << xs[i] << ' '; if (not xs.empty()) out << xs.back(); return out; } int main() { // input int m, n, mulX, addX, mulY, addY, MOD; cin >> m >> n >> mulX >> addX >> mulY >> addY >> MOD; vector X(m); vector Y(m); vector A(m); vector B(m); REP (i, m) cin >> X[i]; REP (i, m) cin >> Y[i]; REP (i, m) cin >> A[i]; REP (i, m) cin >> B[i]; // solve int mask = MOD - 1; vector z(MOD); REP (i, m) { z[X[i]] += Y[i]; } int64_t x_i = X.back(); int64_t y_i = Y.back(); REP3 (i, m, n) { x_i = (x_i * mulX + addX) & mask; y_i = (y_i * mulY + addY) & mask; z[x_i] += y_i; } vector memo(100000, -1); auto go = [&](int64_t step) { if (step < memo.size() and memo[step] != -1) return memo[step]; int64_t cnt = 0; for (int64_t x = 0; x < MOD; x += step) { cnt += z[x]; } if (step < memo.size()) memo[step] = cnt; return cnt; }; // output int64_t acc = 0; REP (j, m) { int64_t cnt = go(A[j]) - go((int64_t)A[j] * B[j]); acc ^= cnt; cout << cnt << endl; } int64_t a_j = A.back(); int64_t b_j = B.back(); REP3 (j, m, n) { a_j = ((a_j * mulX + addX + MOD - 1) & mask) + 1; b_j = ((b_j * mulY + addY + MOD - 1) & mask) + 1; int64_t cnt = go(a_j) - go(a_j * b_j); acc ^= cnt; } cout << acc << endl; return 0; }