886. 求组合数 II
给定 n 组询问,每组询问给定两个整数 a,b,请你输出 的值。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一组 a 和 b。
输出格式
共 n 行,每行输出一个询问的解。
数据范围
1≤n≤10000
1≤b≤a≤105
输入样例:
3
3 1
5 3
2 2
输出样例:
3
10
1
要素
- 10000组数据
- 1 <= b <= a <= 100000
- p = 1e9+7
想要直接预处理所有组合的结果时间复杂度超过10^8,不可取
但是组合数是两个阶乘的除法,故可以先预处理出所有的阶乘
由于是在取模的情况下做计算,而模数p是个质数,所以可以将所有除数转换成其关于p的乘法逆元,然后做乘法
import java.util.*;
public class Main {
static final int N = 100010, MOD = 1000000007;
static int[] fact = new int[N], infact = new int[N];
static {
fact[0] = infact[0] = 1;
for (int i = 1; i < N; i++) {
fact[i] = (int) (1L * fact[i - 1] * i % MOD);
infact[i] = (int) (infact[i - 1] * qmi(i, MOD - 2, MOD) % MOD);
}
}
static long qmi(long a, long b, long p) {
long res = 1;
while (b > 0) {
if ((b & 1) == 1) {
res = res * a % p;
}
a = a * a % p;
b >>= 1;
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
while (m-- > 0) {
int a = sc.nextInt(), b = sc.nextInt();
int res = (int) (1L * fact[a] * infact[b] % MOD * infact[a - b] % MOD);
System.out.println(res);
}
}
}