补习一点语法知识,当一副运算公式里面有long时,公式的运算结果就会转变成long,
所以只要一则运算里面有long类型的,这个公式的数据范围就是long,当公式都是int类型时候,
这则公式的最大范围就是int范围,所以可以自己计算一下两个数乘会不会超出这个公式最大的数据类型,
会超出的话就mod一下,如果超出范围就容易出0;
import java.util.*;
public class Main{
static int N=100010;
static int mod=1000000000+7;
static long fact[]=new long[N];
static long infact[]=new long[N];
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
fact[0]=infact[0]=1;
for(int i=1;i<N;i++){
fact[i]=(fact[i-1]*i)%mod;
infact[i]=infact[i-1]*quick(i,mod-2,mod)%mod;
}
while(n-->0){
int a=sc.nextInt();
int b=sc.nextInt();
System.out.println(fact[a]*infact[b]%mod*infact[a-b]%mod);//每次两个数乘都有可能超出范围,
}
}
static long quick(int a,int k,int p){
long ref=1;
while(k>0){
if((k&1)!=0){
ref=(ref*a%p);
}
a=(int)((long)a*a%p);//a*a会超int,所以先转成long运算,%p后就在int范围了
k>>=1;
}
return ref;
}
}