Advertisement
yicongli

probability

Jan 26th, 2020
366
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.32 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=1e7+7;
  17. const int p=1e9+7;
  18.  
  19. int fac[N];
  20. int facinv[N];
  21.  
  22. inline ll qpow(ll a,int b){
  23.     ll ans=1;
  24.     while(b){
  25.         if(b&1)(ans*=a)%=p;
  26.         (a*=a)%=p;
  27.         b>>=1;
  28.     }
  29.     return ans;
  30. }
  31.  
  32. inline ll inv(ll x){
  33.     return qpow(x,p-2);
  34. }
  35.  
  36. inline ll calc(ll k,ll n){
  37.     int t1=((k-1)*n+1)/p-(k-1)*(n-1)/p;
  38.     int t2=k*n/p-k*(n-1)/p;
  39.     if(t1^t2)return t1>t2?0:-1;
  40.     ll a=1,b=1;
  41.     for(int t=((k-1)*(n-1)+1)%p,i=1;i<=k;++i){
  42.         if(t)(a*=t)%=p;
  43.         if(++t>=p)t-=p;
  44.     }
  45.     for(int t=(k*(n-1)+1)%p,i=1;i<=k;++i){
  46.         if(t)(b*=t)%=p;
  47.         if(++t>=p)t-=p;
  48.     }
  49.     return a*inv(b)%p*n%p;
  50. }
  51.  
  52. int main(){
  53.     freopen("probability.in","r",stdin);
  54.     freopen("probability.out","w",stdout);
  55.     fac[0]=1;
  56.     for(int i=1;i<N;++i){
  57.         fac[i]=(ll)fac[i-1]*i%p;
  58.     }
  59.     facinv[N-1]=inv(fac[N-1]);
  60.     for(int i=N-1;i;--i){
  61.         facinv[i-1]=(ll)facinv[i]*i%p;
  62.     }
  63.     int T,k,n;
  64.     for(r(T);T;--T){
  65.         r(k),r(n);
  66.         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));
  67.     }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement