#include <bits/stdc++.h>
using namespace std;
int n, m, p, q, c, x, y, mod, lo[100000], z[3005][3005];
long long ans;
struct segment_tree {
  int a[3005][13];
  void update(int x, int y) { a[x][0] = y; }
  void build(int n) {
    for (int i = 1; i <= lo[n]; i++)
      for (int j = 1; j + (1 << i) - 1 <= n; j++)
        a[j][i] = min(a[j][i - 1], a[j + (1 << (i - 1))][i - 1]);
  }
  long long find(int x, int y) {
    int len = lo[y - x + 1];
    return min(a[x][len], a[y - (1 << len) + 1][len]);
  }
} a;
int main() {
  scanf("%d%d%d%d", &n, &m, &p, &q);
  scanf("%d%d%d%d", &c, &x, &y, &mod);
  a.update(1, c);
  for (int i = 2; i <= 10000; i++) lo[i] = lo[i >> 1] + 1;
  for (int i = 2; i <= m; i++) c = (1ll * c * x + y) % mod, a.update(i, c);
  a.build(m);
  for (int i = 1; i <= m - q + 1; i++) z[1][i] = a.find(i, i + q - 1);
  for (int i = 2; i <= n; i++) {
    for (int j = 1; j <= m; j++) c = (1ll * c * x + y) % mod, a.update(j, c);
    a.build(m);
    for (int j = 1; j <= m - q + 1; j++) z[i][j] = a.find(j, j + q - 1);
  }
  for (int i = 1; i <= m - q + 1; i++) {
    for (int j = 1; j <= n; j++) a.update(j, z[j][i]);
    a.build(n);
    for (int j = 1; j <= n - p + 1; j++) ans = ans + a.find(j, j + p - 1);
  }
  printf("%lld", ans);
}
