int n, m, k, r, c, v; int f[kMaxL][kMaxL][2], w[kMaxK][kMaxK][2], val[kMaxK], ww[kMaxK][kMaxK];
intqpow(int bs, int64_t idx = kMod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod) if (idx & 1) ret = (int64_t)ret * bs % kMod; return ret; }
inlineintadd(int x, int y){ return (x + y >= kMod ? x + y - kMod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + kMod); } inlinevoidinc(int &x, int y){ (x += y) >= kMod ? x -= kMod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += kMod : x; }
voidget(int det){ memset(f, 0, sizeof(f)); f[det][m + det][det <= r + v - 2 && m + det <= c + v - 2] = 1; for (int i = det; i <= n + k - 1; ++i) { for (int j = m + det; ~j; --j) { if (i == r + v - 1 && j == c + v - 1) continue; int op = (i <= r + v - 2 && j <= c + v - 2); if (i) { for (int lst = 0; lst <= 1; ++lst) inc(f[i][j][lst | op], f[i - 1][j][lst]); } for (int lst = 0; lst <= 1; ++lst) inc(f[i][j][lst | op], f[i][j + 1][lst]); } } for (int i = 0; i < k - 1; ++i) w[det + 1][i + 1][0] = f[n + i][i][0], w[det + 1][i + 1][1] = f[n + i][i][1]; }
intgetdet(int n){ int ret = 1; for (int i = 1; i <= n; ++i) { if (!ww[i][i]) { for (int j = i + 1; j <= n; ++j) { if (ww[j][i]) { std::swap(ww[i], ww[j]), ret = sub(0, ret); break; } } } if (!ww[i][i]) return0; ret = 1ll * ret * ww[i][i] % kMod; for (int j = i + 1; j <= n; ++j) { int d = 1ll * ww[j][i] * qpow(ww[i][i]) % kMod; for (int k = i; k <= n; ++k) dec(ww[j][k], 1ll * ww[i][k] * d % kMod); } } return ret; }
intlagrange(int v){ int ret = 0; for (int i = 1; i <= k; ++i) { staticint f[kMaxK]; memset(f, 0, sizeof(f)); f[0] = 1; int coef = val[i]; for (int j = 1; j <= k; ++j) { if (i == j) continue; coef = 1ll * coef * qpow(sub(i, j)) % kMod; for (int s = k - 1; ~s; --s) { f[s] = 1ll * f[s] * (kMod - j) % kMod; if (s) inc(f[s], f[s - 1]); } } inc(ret, 1ll * coef * f[v] % kMod); // std::cerr << ret << ' ' << 1ll * coef * f[v] % kMod << '\n'; } return ret; }
voiddickdreamer(){ std::cin >> n >> m >> k >> r >> c >> v; --r, --c; for (int i = 0; i < k - 1; ++i) get(i); // for (int i = 1; i <= k - 1; ++i) { // for (int j = 1; j <= k - 1; ++j) { // std::cerr << w[i][j][0] << " \n"[j == k - 1]; // } // } // for (int i = 1; i <= k - 1; ++i) { // for (int j = 1; j <= k - 1; ++j) { // std::cerr << w[i][j][1] << " \n"[j == k - 1]; // } // } for (int i = 1; i <= k; ++i) { for (int x = 1; x <= k - 1; ++x) for (int y = 1; y <= k - 1; ++y) ww[x][y] = add(w[x][y][0], 1ll * i * w[x][y][1] % kMod); val[i] = getdet(k - 1); } std::cout << lagrange(v - 1) << '\n'; }