#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb emplace_back
#define ii pair<int, int>
#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
#define sz(s) (int)((s).size())
#define all(a) a.begin(), a.end()
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i)
#define F0R(i, b) for (int i = 0, _b = (b); i < _b; ++i)
#define FORd(i, a, b) for (int i = (a), _b = (b); i >= _b; --i)
#define F0Rd(i, b) for (int i = (b)-1; i >= 0; i--)
using namespace std;
template<typename T1, typename T2> bool ckmax(T1 &A, const T2 &B){if(A < B){A = B;return true;} return false;}
template<typename T1, typename T2> bool ckmin(T1 &A, const T2 &B){if(A > B){A = B;return true;} return false;}
const int MOD = (int)1234567891; // 998244353
const int N = 123 + 10, M = 18;
const int INF = (int)2e9 + 11;
const long long LINF = (long long)4e18 + 11;
/*
/\_/\
(= ._.)
/ >? \>$
*/
#define int long long
int pref[N], suf[N];
int F[N], IF[N];
int f[N];
int Pow(int a, int b){
int res = 1;
for(; b > 0; b >>= 1, a = 1LL * a * a % MOD) if(b & 1) res = 1LL * res * a % MOD;
return res;
}
int S(int k, long long m){
int n = k+1;
pref[0] = m;
FOR(i, 1, n) pref[i] = 1LL * pref[i-1] * (m-i) % MOD;
suf[n] = m-n;
F0Rd(i, n) suf[i] = 1LL * suf[i+1] * (m-i) % MOD;
int res = 0, fi = 0;
for(int i = 0; i <= n; i++){
fi = (fi + Pow(i, k) * (i > 0)) % MOD;
// cout << i << ' ' << fi << ' ' << Pow(i, k) << '\n';
int num = 1LL * (i == 0 ? 1 : pref[i-1]) * (i == n ? 1 : suf[i+1]) % MOD;
int dem = 1LL * IF[i] * IF[n-i] % MOD;
if((n-i) & 1) num = (MOD - num) % MOD;
(res += (1LL * fi * num % MOD * dem % MOD + MOD) % MOD) %= MOD;
if(res < 0) res += MOD;
}
return res;
}
int T(int k, long long m){
int res = 1LL * (m+1) * S(k, m) % MOD;
res = (res + (MOD - S(k+1, m)) % MOD) % MOD;
return res;
}
// code chưa xử lí tràn số khi m > 2*10^9
void sol(void){
int k, a, m, d; cin >> k >> a >> m >> d;
int n = k+3;
F[0] = 1;
FOR(i, 1, n) F[i] = 1LL * F[i-1] * i % MOD;
IF[n] = Pow(F[n], MOD-2);
F0Rd(i, n) IF[i] = 1LL * IF[i+1] * (i+1) % MOD;
// fi
f[0] = T(k, a);
FOR(i, 1, n) f[i] = (f[i-1] + T(k, a+i*d)) % MOD;
// pref, suf
pref[0] = m;
FOR(i, 1, n) pref[i] = 1LL * pref[i-1] * (m-i) % MOD;
suf[n] = m-n;
F0Rd(i, n) suf[i] = 1LL * suf[i+1] * (m-i) % MOD;
// f(x)
int res = 0;
for(int i = 0; i <= n; i++){
int num = 1LL * (i == 0 ? 1 : pref[i-1]) * (i == n ? 1 : suf[i+1]) % MOD;
int dem = 1LL * IF[i] * IF[n-i] % MOD;
if((n-i) & 1) num = (MOD - num) % MOD;
(res += (1LL * f[i] * num % MOD * dem % MOD + MOD) % MOD) %= MOD;
if(res < 0) res += MOD;
}
cout << res << '\n';
}
signed main(void){
#define TASK "nhap"
if(fopen(TASK".inp", "r")){
freopen(TASK".inp", "r", stdin);
freopen(TASK".out", "w", stdout);
}
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int t = 1;
cin >> t;
while(t--) sol();
cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << " ms\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBwYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBpaSBwYWlyPGludCwgaW50PgojZGVmaW5lIE1BU0soaSkgKDFMTCA8PCAoaSkpCiNkZWZpbmUgQklUKHgsIGkpICgoKHgpID4+IChpKSkgJiAxKQojZGVmaW5lIHN6KHMpIChpbnQpKChzKS5zaXplKCkpCiNkZWZpbmUgYWxsKGEpIGEuYmVnaW4oKSwgYS5lbmQoKQojZGVmaW5lIEZPUihpLCBhLCBiKSBmb3IgKGludCBpID0gKGEpLCBfYiA9IChiKTsgaSA8PSBfYjsgKytpKQojZGVmaW5lIEYwUihpLCBiKSBmb3IgKGludCBpID0gMCwgX2IgPSAoYik7IGkgPCBfYjsgKytpKQojZGVmaW5lIEZPUmQoaSwgYSwgYikgZm9yIChpbnQgaSA9IChhKSwgX2IgPSAoYik7IGkgPj0gX2I7IC0taSkKI2RlZmluZSBGMFJkKGksIGIpIGZvciAoaW50IGkgPSAoYiktMTsgaSA+PSAwOyBpLS0pCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+IGJvb2wgY2ttYXgoVDEgJkEsIGNvbnN0IFQyICZCKXtpZihBIDwgQil7QSA9IEI7cmV0dXJuIHRydWU7fSByZXR1cm4gZmFsc2U7fQp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+IGJvb2wgY2ttaW4oVDEgJkEsIGNvbnN0IFQyICZCKXtpZihBID4gQil7QSA9IEI7cmV0dXJuIHRydWU7fSByZXR1cm4gZmFsc2U7fQoKY29uc3QgaW50IE1PRCA9IChpbnQpMTIzNDU2Nzg5MTsgLy8gOTk4MjQ0MzUzCmNvbnN0IGludCBOID0gMTIzICsgMTAsIE0gPSAxODsKY29uc3QgaW50IElORiA9IChpbnQpMmU5ICsgMTE7CmNvbnN0IGxvbmcgbG9uZyBMSU5GID0gKGxvbmcgbG9uZyk0ZTE4ICsgMTE7CgovKgogICAgIC9cXy9cCiAgICAoPSAuXy4pCiAgICAvID4/ICBcPiQKKi8KCiNkZWZpbmUgaW50IGxvbmcgbG9uZwppbnQgcHJlZltOXSwgc3VmW05dOwppbnQgRltOXSwgSUZbTl07CmludCBmW05dOwoKaW50IFBvdyhpbnQgYSwgaW50IGIpewogICAgaW50IHJlcyA9IDE7CiAgICBmb3IoOyBiID4gMDsgYiA+Pj0gMSwgYSA9IDFMTCAqIGEgKiBhICUgTU9EKSBpZihiICYgMSkgcmVzID0gMUxMICogcmVzICogYSAlIE1PRDsKICAgIHJldHVybiByZXM7Cn0KCmludCBTKGludCBrLCBsb25nIGxvbmcgbSl7CiAgICBpbnQgbiA9IGsrMTsKICAgIHByZWZbMF0gPSBtOwogICAgRk9SKGksIDEsIG4pIHByZWZbaV0gPSAxTEwgKiBwcmVmW2ktMV0gKiAobS1pKSAlIE1PRDsKICAgIHN1ZltuXSA9IG0tbjsKICAgIEYwUmQoaSwgbikgc3VmW2ldID0gMUxMICogc3VmW2krMV0gKiAobS1pKSAlIE1PRDsKCiAgICBpbnQgcmVzID0gMCwgZmkgPSAwOwogICAgZm9yKGludCBpID0gMDsgaSA8PSBuOyBpKyspewogICAgICAgIGZpID0gKGZpICsgUG93KGksIGspICogKGkgPiAwKSkgJSBNT0Q7Ci8vICAgICAgICBjb3V0IDw8IGkgPDwgJyAnIDw8IGZpIDw8ICcgJyA8PCBQb3coaSwgaykgPDwgJ1xuJzsKICAgICAgICBpbnQgbnVtID0gMUxMICogKGkgPT0gMCA/IDEgOiBwcmVmW2ktMV0pICogKGkgPT0gbiA/IDEgOiBzdWZbaSsxXSkgJSBNT0Q7CiAgICAgICAgaW50IGRlbSA9IDFMTCAqIElGW2ldICogSUZbbi1pXSAlIE1PRDsKICAgICAgICBpZigobi1pKSAmIDEpIG51bSA9IChNT0QgLSBudW0pICUgTU9EOwogICAgICAgIChyZXMgKz0gKDFMTCAqIGZpICogbnVtICUgTU9EICogZGVtICUgTU9EICsgTU9EKSAlIE1PRCkgJT0gTU9EOwogICAgICAgIGlmKHJlcyA8IDApIHJlcyArPSBNT0Q7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgppbnQgVChpbnQgaywgbG9uZyBsb25nIG0pewogICAgaW50IHJlcyA9IDFMTCAqIChtKzEpICogUyhrLCBtKSAlIE1PRDsKICAgIHJlcyA9IChyZXMgKyAoTU9EIC0gUyhrKzEsIG0pKSAlIE1PRCkgJSBNT0Q7CiAgICByZXR1cm4gcmVzOwp9CgovLyBjb2RlIGNoxrBhIHjhu60gbMOtIHRyw6BuIHPhu5Ega2hpIG0gPiAyKjEwXjkKdm9pZCBzb2wodm9pZCl7CiAgICBpbnQgaywgYSwgbSwgZDsgY2luID4+IGsgPj4gYSA+PiBtID4+IGQ7CiAgICBpbnQgbiA9IGsrMzsKICAgIEZbMF0gPSAxOwogICAgRk9SKGksIDEsIG4pIEZbaV0gPSAxTEwgKiBGW2ktMV0gKiBpICUgTU9EOwogICAgSUZbbl0gPSBQb3coRltuXSwgTU9ELTIpOwogICAgRjBSZChpLCBuKSBJRltpXSA9IDFMTCAqIElGW2krMV0gKiAoaSsxKSAlIE1PRDsKCiAgICAvLyBmaQogICAgZlswXSA9IFQoaywgYSk7CiAgICBGT1IoaSwgMSwgbikgZltpXSA9IChmW2ktMV0gKyBUKGssIGEraSpkKSkgJSBNT0Q7CgogICAgLy8gcHJlZiwgc3VmCiAgICBwcmVmWzBdID0gbTsKICAgIEZPUihpLCAxLCBuKSBwcmVmW2ldID0gMUxMICogcHJlZltpLTFdICogKG0taSkgJSBNT0Q7CiAgICBzdWZbbl0gPSBtLW47CiAgICBGMFJkKGksIG4pIHN1ZltpXSA9IDFMTCAqIHN1ZltpKzFdICogKG0taSkgJSBNT0Q7CgogICAgLy8gZih4KQogICAgaW50IHJlcyA9IDA7CiAgICBmb3IoaW50IGkgPSAwOyBpIDw9IG47IGkrKyl7CiAgICAgICAgaW50IG51bSA9IDFMTCAqIChpID09IDAgPyAxIDogcHJlZltpLTFdKSAqIChpID09IG4gPyAxIDogc3VmW2krMV0pICUgTU9EOwogICAgICAgIGludCBkZW0gPSAxTEwgKiBJRltpXSAqIElGW24taV0gJSBNT0Q7CiAgICAgICAgaWYoKG4taSkgJiAxKSBudW0gPSAoTU9EIC0gbnVtKSAlIE1PRDsKICAgICAgICAocmVzICs9ICgxTEwgKiBmW2ldICogbnVtICUgTU9EICogZGVtICUgTU9EICsgTU9EKSAlIE1PRCkgJT0gTU9EOwogICAgICAgIGlmKHJlcyA8IDApIHJlcyArPSBNT0Q7CiAgICB9CiAgICBjb3V0IDw8IHJlcyA8PCAnXG4nOwp9CgpzaWduZWQgbWFpbih2b2lkKXsKICAgICNkZWZpbmUgVEFTSyAibmhhcCIKICAgIGlmKGZvcGVuKFRBU0siLmlucCIsICJyIikpewogICAgICAgIGZyZW9wZW4oVEFTSyIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihUQVNLIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7CiAgICBpbnQgdCA9IDE7CiAgICBjaW4gPj4gdDsKICAgIHdoaWxlKHQtLSkgc29sKCk7CiAgICBjZXJyIDw8ICJcblRpbWUgZWxhcHNlZDogIiA8PCAxMDAwICogY2xvY2soKSAvIENMT0NLU19QRVJfU0VDIDw8ICIgbXNcbiI7Cn0KCg==