#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define FAST ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)
#define ll long long
#define ld long double
#define int long long
#define endl "\n"
#define yes cout<<"YES"<<endl;
#define no cout<<"NO"<<endl;
#define pb push_back
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
using namespace std;
const int mod = 1e9+7;
const int N = 1e5+5;
const ll INF = 1e18;
const ll MIN = -1e18;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> indexed_set;
inline int add(int a, int b) {
a += b;
return (a >= mod ? a - mod : a);
}
inline int mult(int a, int b) {
return (a * b) % mod;
}
constexpr int N_mat = 10;
struct Matrix {
int mat[N_mat][N_mat];
int len;
Matrix(int n) : len(n) {
memset(mat, 0, sizeof(mat));
}
Matrix operator*(const Matrix& other) const {
Matrix res(len);
for (int i = 1; i <= len; i++) {
for (int j = 1; j <= len; j++) {
long long sum = 0;
for (int k = 1; k <= len; k++) {
sum += 1LL * mat[i][k] * other.mat[k][j];
}
res.mat[i][j] = sum % mod;
}
}
return res;
}
Matrix operator+(const Matrix& other) const {
Matrix res(len);
for (int i = 1; i <= len; i++)
for (int j = 1; j <= len; j++)
res.mat[i][j] = add(mat[i][j], other.mat[i][j]);
return res;
}
};
Matrix expo_power(Matrix M, int K) {
Matrix res(M.len);
for (int i = 1; i <= M.len; i++) res.mat[i][i] = 1;
while (K) {
if (K & 1) res = res * M;
M = M * M;
K >>= 1;
}
return res;
}
int inv(int a, int m) {
int m0 = m, x0 = 0, x1 = 1;
if (m == 1) return 0;
while (a > 1) {
int q = a / m;
tie(a, m) = make_pair(m, a % m);
tie(x1, x0) = make_pair(x0, x1 - q * x0);
}
return (x1 + m0) % m0;
}
void resoudreSystemeModulaire(int a1, int b1, int c1, int a2, int b2, int c2) {
int D = ((a1 * b2 - a2 * b1) % mod + mod) % mod;
int Dx = ((c1 * b2 - c2 * b1) % mod + mod) % mod;
int Dy = ((a1 * c2 - a2 * c1) % mod + mod) % mod;
int invD = inv(D, mod);
int x = (Dx * invD) % mod;
int y = (Dy * invD) % mod;
cout << x << " " << y << endl;
}
void solve() {
Matrix mt(2);
mt.mat[1][1] = mt.mat[1][2] = mt.mat[2][1] = 1;
int n, m, a, b;
cin >> n >> m >> a >> b;
int nb1a = 0, nb2a = 0, nb1b = 0, nb2b = 0;
if (n == 0) nb1a = 1;
else if (n == 1) nb2a = 1;
else {
auto res = expo_power(mt, n - 1);
nb2a = res.mat[1][1];
nb1a = res.mat[1][2];
}
if (m == 0) nb1b = 1;
else if (m == 1) nb2b = 1;
else {
auto res = expo_power(mt, m - 1);
nb2b = res.mat[1][1];
nb1b = res.mat[1][2];
}
resoudreSystemeModulaire(nb1a, nb2a, a, nb1b, nb2b, b);
}
signed main() {
FAST;
auto begin = chrono::high_resolution_clock::now();
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int t = 1;
cin >> t;
while (t--) solve();
#ifndef ONLINE_JUDGE
auto end = chrono::high_resolution_clock::now();
cout << fixed << setprecision(4);
cout << "Execution time: " << chrono::duration_cast<chrono::duration<double>>(end - begin).count() << " seconds" << endl;
#endif
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiNkZWZpbmUgRkFTVCBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKSwgY2luLnRpZSgwKSxjb3V0LnRpZSgwKQojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGxkIGxvbmcgZG91YmxlCiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGVuZGwgIlxuIgojZGVmaW5lIHllcyBjb3V0PDwiWUVTIjw8ZW5kbDsKI2RlZmluZSBubyBjb3V0PDwiTk8iPDxlbmRsOwojZGVmaW5lIHBiIHB1c2hfYmFjawojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiTzMsdW5yb2xsLWxvb3BzIikKI3ByYWdtYSBHQ0MgdGFyZ2V0KCJhdngyLGJtaSxibWkyLGx6Y250LHBvcGNudCIpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBtb2QgPSAxZTkrNzsKY29uc3QgaW50IE4gPSAxZTUrNTsKY29uc3QgbGwgSU5GID0gMWUxODsKY29uc3QgbGwgTUlOID0gLTFlMTg7CnR5cGVkZWYgdHJlZTxsbCxudWxsX3R5cGUsbGVzczxsbD4scmJfdHJlZV90YWcsdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPiBpbmRleGVkX3NldDsKCmlubGluZSBpbnQgYWRkKGludCBhLCBpbnQgYikgewogICAgYSArPSBiOwogICAgcmV0dXJuIChhID49IG1vZCA/IGEgLSBtb2QgOiBhKTsKfQoKaW5saW5lIGludCBtdWx0KGludCBhLCBpbnQgYikgewogICAgcmV0dXJuIChhICogYikgJSBtb2Q7Cn0KCmNvbnN0ZXhwciBpbnQgTl9tYXQgPSAxMDsKCnN0cnVjdCBNYXRyaXggewogICAgaW50IG1hdFtOX21hdF1bTl9tYXRdOwogICAgaW50IGxlbjsKCiAgICBNYXRyaXgoaW50IG4pIDogbGVuKG4pIHsKICAgICAgICBtZW1zZXQobWF0LCAwLCBzaXplb2YobWF0KSk7CiAgICB9CgogICAgTWF0cml4IG9wZXJhdG9yKihjb25zdCBNYXRyaXgmIG90aGVyKSBjb25zdCB7CiAgICAgICAgTWF0cml4IHJlcyhsZW4pOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IGxlbjsgaisrKSB7CiAgICAgICAgICAgICAgICBsb25nIGxvbmcgc3VtID0gMDsKICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAxOyBrIDw9IGxlbjsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgc3VtICs9IDFMTCAqIG1hdFtpXVtrXSAqIG90aGVyLm1hdFtrXVtqXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcy5tYXRbaV1bal0gPSBzdW0gJSBtb2Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICBNYXRyaXggb3BlcmF0b3IrKGNvbnN0IE1hdHJpeCYgb3RoZXIpIGNvbnN0IHsKICAgICAgICBNYXRyaXggcmVzKGxlbik7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspCiAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IGxlbjsgaisrKQogICAgICAgICAgICAgICAgcmVzLm1hdFtpXVtqXSA9IGFkZChtYXRbaV1bal0sIG90aGVyLm1hdFtpXVtqXSk7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KfTsKCk1hdHJpeCBleHBvX3Bvd2VyKE1hdHJpeCBNLCBpbnQgSykgewogICAgTWF0cml4IHJlcyhNLmxlbik7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBNLmxlbjsgaSsrKSByZXMubWF0W2ldW2ldID0gMTsKICAgIHdoaWxlIChLKSB7CiAgICAgICAgaWYgKEsgJiAxKSByZXMgPSByZXMgKiBNOwogICAgICAgIE0gPSBNICogTTsKICAgICAgICBLID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKaW50IGludihpbnQgYSwgaW50IG0pIHsKICAgIGludCBtMCA9IG0sIHgwID0gMCwgeDEgPSAxOwogICAgaWYgKG0gPT0gMSkgcmV0dXJuIDA7CiAgICB3aGlsZSAoYSA+IDEpIHsKICAgICAgICBpbnQgcSA9IGEgLyBtOwogICAgICAgIHRpZShhLCBtKSA9IG1ha2VfcGFpcihtLCBhICUgbSk7CiAgICAgICAgdGllKHgxLCB4MCkgPSBtYWtlX3BhaXIoeDAsIHgxIC0gcSAqIHgwKTsKICAgIH0KICAgIHJldHVybiAoeDEgKyBtMCkgJSBtMDsKfQoKdm9pZCByZXNvdWRyZVN5c3RlbWVNb2R1bGFpcmUoaW50IGExLCBpbnQgYjEsIGludCBjMSwgaW50IGEyLCBpbnQgYjIsIGludCBjMikgewogICAgaW50IEQgPSAoKGExICogYjIgLSBhMiAqIGIxKSAlIG1vZCArIG1vZCkgJSBtb2Q7CiAgICBpbnQgRHggPSAoKGMxICogYjIgLSBjMiAqIGIxKSAlIG1vZCArIG1vZCkgJSBtb2Q7CiAgICBpbnQgRHkgPSAoKGExICogYzIgLSBhMiAqIGMxKSAlIG1vZCArIG1vZCkgJSBtb2Q7CiAgICBpbnQgaW52RCA9IGludihELCBtb2QpOwogICAgaW50IHggPSAoRHggKiBpbnZEKSAlIG1vZDsKICAgIGludCB5ID0gKER5ICogaW52RCkgJSBtb2Q7CiAgICBjb3V0IDw8IHggPDwgIiAiIDw8IHkgPDwgZW5kbDsKfQoKdm9pZCBzb2x2ZSgpIHsKICAgIE1hdHJpeCBtdCgyKTsKICAgIG10Lm1hdFsxXVsxXSA9IG10Lm1hdFsxXVsyXSA9IG10Lm1hdFsyXVsxXSA9IDE7CiAgICBpbnQgbiwgbSwgYSwgYjsKICAgIGNpbiA+PiBuID4+IG0gPj4gYSA+PiBiOwogICAgaW50IG5iMWEgPSAwLCBuYjJhID0gMCwgbmIxYiA9IDAsIG5iMmIgPSAwOwogICAgaWYgKG4gPT0gMCkgbmIxYSA9IDE7CiAgICBlbHNlIGlmIChuID09IDEpIG5iMmEgPSAxOwogICAgZWxzZSB7CiAgICAgICAgYXV0byByZXMgPSBleHBvX3Bvd2VyKG10LCBuIC0gMSk7CiAgICAgICAgbmIyYSA9IHJlcy5tYXRbMV1bMV07CiAgICAgICAgbmIxYSA9IHJlcy5tYXRbMV1bMl07CiAgICB9CiAgICBpZiAobSA9PSAwKSBuYjFiID0gMTsKICAgIGVsc2UgaWYgKG0gPT0gMSkgbmIyYiA9IDE7CiAgICBlbHNlIHsKICAgICAgICBhdXRvIHJlcyA9IGV4cG9fcG93ZXIobXQsIG0gLSAxKTsKICAgICAgICBuYjJiID0gcmVzLm1hdFsxXVsxXTsKICAgICAgICBuYjFiID0gcmVzLm1hdFsxXVsyXTsKICAgIH0KICAgIHJlc291ZHJlU3lzdGVtZU1vZHVsYWlyZShuYjFhLCBuYjJhLCBhLCBuYjFiLCBuYjJiLCBiKTsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBGQVNUOwogICAgYXV0byBiZWdpbiA9IGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgICNpZm5kZWYgT05MSU5FX0pVREdFCiAgICAgICAgZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKICAgICNlbmRpZgogICAgaW50IHQgPSAxOwogICAgY2luID4+IHQ7CiAgICB3aGlsZSAodC0tKSBzb2x2ZSgpOwogICAgI2lmbmRlZiBPTkxJTkVfSlVER0UKICAgICAgICBhdXRvIGVuZCA9IGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgICAgICBjb3V0IDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbig0KTsKICAgICAgICBjb3V0IDw8ICJFeGVjdXRpb24gdGltZTogIiA8PCBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+PihlbmQgLSBiZWdpbikuY291bnQoKSA8PCAiIHNlY29uZHMiIDw8IGVuZGw7CiAgICAjZW5kaWYKfQo=