886. 求组合数 II
给定 n 组询问,每组询问给定两个整数 a,b,请你输出 的值。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一组 a 和 b。
输出格式
共 n 行,每行输出一个询问的解。
数据范围
1≤n≤10000
1≤b≤a≤105
输入样例:
33 15 32 2
输出样例:
3101
要素
- 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);}}}
