#include <bits/stdc++.h>
#pragma GCC target("avx,avx2")
#pragma GCC optimize("Ofast")
using namespace std;
int v[3000][3000];
struct minWindow {
  int n;
  deque<int> l, m;
  minWindow(int k) : n(k) {}
  void insert(int x, int p) {
    while (l.size() && x < l.back()) {
      l.pop_back();
      m.pop_back();
    }
    l.push_back(x);
    m.push_back(p);
  }
  int getMin(int p) {
    while (m.size() && p - *m.begin() >= n) {
      m.pop_front();
      l.pop_front();
    }
    return *l.begin();
  }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, m, a, b;
  cin >> n >> m >> a >> b;
  long long g, x, y, z;
  cin >> g >> x >> y >> z;
  v[0][0] = g;
  for (int i = (0); i < int(n); i++) {
    for (int j = (0); j < int(m); j++) {
      v[i][j] = g;
      g = (g * x + y) % z;
    }
  }
  vector<minWindow> rowans(n, minWindow(b));
  for (int i = (0); i < int(n); i++) {
    for (int j = (0); j < int(b - 1); j++) {
      rowans[i].insert(v[i][j], j);
    }
  }
  long long ans = 0;
  for (int j = (b - 1); j < int(m); j++) {
    minWindow curans(a);
    for (int i = (0); i < int(n); i++) {
      rowans[i].insert(v[i][j], j);
    }
    for (int i = (0); i < int(a - 1); i++)
      curans.insert(rowans[i].getMin(j), i);
    for (int i = (a - 1); i < int(n); i++) {
      curans.insert(rowans[i].getMin(j), i);
      ans += curans.getMin(i);
    }
  }
  cout << ans << '\n';
}
