#include <stdio.h>
#include <iostream>
#include <cmath>
#define MOD 1000000007
using namespace std;
struct Matrix
{
long long int A[2][2] ;
};
Matrix mult(Matrix M, Matrix N){
Matrix C ;
C.A[0][0] = (M.A[0][0] * N.A[0][0] + M.A[0][1] * N.A[1][0]) % (MOD - 1) ;
C.A[0][1] = (M.A[0][0] * N.A[0][1] + M.A[0][1] * N.A[1][1]) % (MOD - 1) ;
C.A[1][0] = (M.A[1][0] * N.A[0][0] + M.A[1][1] * N.A[1][0]) % (MOD - 1) ;
C.A[1][1] = (M.A[1][0] * N.A[0][1] + M.A[1][1] * N.A[1][1]) % (MOD - 1) ;
return C;
}
Matrix Bin_Exp(Matrix A, int n) {
if (n == 1)
return A ;
Matrix inter = Bin_Exp(A, n / 2) ;
if (n % 2)
return mult(A, mult(inter, inter));
return mult(inter, inter) ;
}
long long int bin_exp(long long int base, long long int exp){
if (exp == 0)
return 1;
if (exp == 1)
return base % MOD ;
long long int inter = bin_exp(base, exp / 2) ;
if (exp % 2)
return ((base % MOD) * (inter * inter)%MOD)%MOD;
return (inter * inter) % MOD;
}
int main(){
int t, F0, F1, n, K ;
Matrix trans ;
scanf("%d", &t) ;
while(t--){
scanf("%d %d %d %d", &F0, &F1, &n, &K);
trans.A[0][0] = K; trans.A[0][1] = K ;
trans.A[1][0] = 1; trans.A[1][1] = 0 ;
if (n == 1){
printf("%d\n", F1);
continue;
}
if (n == 0){
printf("%d\n", F0);
continue;
}
Matrix ans = Bin_Exp(trans, n-1) ;
long long int sol = (bin_exp(F1, ans.A[0][0]) * bin_exp(F0, ans.A[0][1]))%MOD ;
printf("%lld\n", sol);
}
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNtYXRoPgojZGVmaW5lIE1PRCAxMDAwMDAwMDA3CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTWF0cml4CnsKCQlsb25nIGxvbmcgaW50IEFbMl1bMl0gOwoKfTsKCk1hdHJpeCBtdWx0KE1hdHJpeCBNLCBNYXRyaXggTil7CgoKCU1hdHJpeCBDIAk7CgoJQy5BWzBdWzBdID0gKE0uQVswXVswXSAqIE4uQVswXVswXSArIE0uQVswXVsxXSAqIE4uQVsxXVswXSkJJSAoTU9EIC0gMSkgICA7ICAgICAgICAgICAKCUMuQVswXVsxXSA9IChNLkFbMF1bMF0gKiBOLkFbMF1bMV0gKyBNLkFbMF1bMV0gKiBOLkFbMV1bMV0pICUgKE1PRCAtIDEpICAgOwoJQy5BWzFdWzBdID0gKE0uQVsxXVswXSAqIE4uQVswXVswXSArIE0uQVsxXVsxXSAqIE4uQVsxXVswXSkgJSAoTU9EIC0gMSkgICA7ICAKCUMuQVsxXVsxXSA9IChNLkFbMV1bMF0gKiBOLkFbMF1bMV0gKyBNLkFbMV1bMV0gKiBOLkFbMV1bMV0pICUgKE1PRCAtIDEpICAgOwoKCXJldHVybiBDOwoKfQoKTWF0cml4IEJpbl9FeHAoTWF0cml4IEEsIGludCBuKQl7CgoJaWYgKG4gPT0gMSkKCQlyZXR1cm4gQQk7CgoJTWF0cml4IGludGVyID0gQmluX0V4cChBLCBuIC8gMikJOwoKCWlmIChuICUgMikKCQlyZXR1cm4gbXVsdChBLCBtdWx0KGludGVyLCBpbnRlcikpOwoJcmV0dXJuIG11bHQoaW50ZXIsIGludGVyKQk7Cn0KCmxvbmcgbG9uZyBpbnQgYmluX2V4cChsb25nIGxvbmcgaW50IGJhc2UsIGxvbmcgbG9uZyBpbnQgZXhwKXsKCglpZiAoZXhwID09IDApCgkJcmV0dXJuIDE7CgoJaWYgKGV4cCA9PSAxKQoJCXJldHVybiBiYXNlICUgTU9ECTsKCglsb25nIGxvbmcgaW50IGludGVyID0gYmluX2V4cChiYXNlLCBleHAgLyAyKQk7CglpZiAoZXhwICUgMikKCQlyZXR1cm4gKChiYXNlICUgTU9EKSAgKiAoaW50ZXIgKiBpbnRlciklTU9EKSVNT0Q7CglyZXR1cm4gKGludGVyICogaW50ZXIpICUgTU9EOwoKfQoKCmludCBtYWluKCl7CgoJaW50IHQsIEYwLCBGMSwgbiwgSyA7CglNYXRyaXggdHJhbnMgOwoJc2NhbmYoIiVkIiwgJnQpCTsKCXdoaWxlKHQtLSl7CgoJCXNjYW5mKCIlZCAlZCAlZCAlZCIsICZGMCwgJkYxLCAmbiwgJkspOwoKCQl0cmFucy5BWzBdWzBdID0gSzsgdHJhbnMuQVswXVsxXSA9IEsgOwoJCXRyYW5zLkFbMV1bMF0gPSAxOyB0cmFucy5BWzFdWzFdID0gMCA7CgoJCWlmIChuID09IDEpewoJCQlwcmludGYoIiVkXG4iLCBGMSk7CgkJCWNvbnRpbnVlOwoJCX0KCgkJaWYgKG4gPT0gMCl7CgkJCXByaW50ZigiJWRcbiIsIEYwKTsKCQkJY29udGludWU7CgkJfQoJCQoJCU1hdHJpeCBhbnMgPSBCaW5fRXhwKHRyYW5zLCBuLTEpCTsgCgoJCWxvbmcgbG9uZyBpbnQgc29sID0gKGJpbl9leHAoRjEsIGFucy5BWzBdWzBdKSAqIGJpbl9leHAoRjAsIGFucy5BWzBdWzFdKSklTU9ECTsKCQlwcmludGYoIiVsbGRcbiIsIHNvbCk7Cgl9CgoJcmV0dXJuIDAJOwp9CiAgICAK