Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=1e7+7;
- const int p=1e9+7;
- int fac[N];
- int facinv[N];
- inline ll qpow(ll a,int b){
- ll ans=1;
- while(b){
- if(b&1)(ans*=a)%=p;
- (a*=a)%=p;
- b>>=1;
- }
- return ans;
- }
- inline ll inv(ll x){
- return qpow(x,p-2);
- }
- inline ll calc(ll k,ll n){
- int t1=((k-1)*n+1)/p-(k-1)*(n-1)/p;
- int t2=k*n/p-k*(n-1)/p;
- if(t1^t2)return t1>t2?0:-1;
- ll a=1,b=1;
- for(int t=((k-1)*(n-1)+1)%p,i=1;i<=k;++i){
- if(t)(a*=t)%=p;
- if(++t>=p)t-=p;
- }
- for(int t=(k*(n-1)+1)%p,i=1;i<=k;++i){
- if(t)(b*=t)%=p;
- if(++t>=p)t-=p;
- }
- return a*inv(b)%p*n%p;
- }
- int main(){
- freopen("probability.in","r",stdin);
- freopen("probability.out","w",stdout);
- fac[0]=1;
- for(int i=1;i<N;++i){
- fac[i]=(ll)fac[i-1]*i%p;
- }
- facinv[N-1]=inv(fac[N-1]);
- for(int i=N-1;i;--i){
- facinv[i-1]=(ll)facinv[i]*i%p;
- }
- int T,k,n;
- for(r(T);T;--T){
- r(k),r(n);
- printf("%lld\n",(ll)k*n<=1e7?((ll)fac[k*(n-1)]*fac[(k-1)*n+1]%p*facinv[(k-1)*(n-1)]%p*facinv[k*n]%p*n%p):calc(k,n));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement