RT , sub1 的最后两个点过不去
#include<bits/stdc++.h>
#define int __int128
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MOD=1145141,MAXN=1145141+100;
namespace IO {
int read(void) {
int s=0,f=0; char ch=getchar();
while(!(ch>='0'&&ch<='9')) f=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return f?-s:s;
}
void write(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) write(x/10);
return putchar(x%10+'0'),void();
}
};
using namespace IO;
int qpow(int base,int p) {
int ans=1; base%=MOD;
while(p) {
if(p&1) ans*=base,ans%=MOD;
base*=base,base%=MOD,p>>=1;
}
return ans;
}
int n,pre[MAXN];
int prod(int l,int r) {
l%=MOD,r%=MOD;
if(r==0) r=MOD;
if(l==0) l++; if(r==MOD) r--;
return pre[r]*qpow(pre[l-1],MOD-2)%MOD;
}
pair<int,int> calc(int a,int b) { //计算 a...b 乘积模 1145141 的值 ( 把 1145141 去掉 ) , 同时返回 1145141 的因子个数
if(a>b) return {1,0};
if(a==b) {
if(a%MOD==0) return {1,1};
return {a%MOD,0};
}
int cnt=0;
if(a%MOD==0) cnt++,a++; if(b%MOD==0) cnt++,b--;
int l=(a-1)/MOD,r=b/MOD;
int sum=r-l;
if(sum==0) return {prod(a%MOD,b%MOD),sum+cnt};
return {qpow(prod(1,MOD-1),sum-1)*prod(a%MOD,MOD-1)%MOD*prod(1,b%MOD)%MOD,cnt+sum};
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
pre[1]=1,pre[0]=1;
ffor(i,2,MOD-1) pre[i]=pre[i-1]*i%MOD;
pre[MOD]=pre[MOD-1];
int t=read();
while(t--) {
int n,k; n=read(),k=read();
if(n==1) {write(1),puts("");continue;}
int mul=qpow(qpow(k-1,n-1),MOD-2);
auto pr1=calc(n*k-n+1,n*k-1),pr2=calc(1,n-1);
if((k-1)%MOD==0) pr2.second+=n-1;
if(pr1.second-pr2.second>0) write(0),puts("");
else if(pr1.second-pr2.second<0) write(-1),puts("");
else {
int K=pr1.first*qpow(pr2.first,MOD-2)%MOD;
int res=K*mul%MOD;
write(res),puts("");
}
}
return 0;
}