①. 题目
②. 思路
分解质因数
-
C[a][b] = p1^m1 * p2^m2 * … * pk^mk;其中
p1~pk
都是1~a中的质数; -
m1~mk
是其中对应的每个素数的次数,是在a中的次数 - b 中的次数 - (a - b)中的次数
; -
一个技巧就是获得
a!的所有质因子
,b!的所有质因子
,(a-b)!的所有质因子
, -
然后用
a的质因子的个数减去后两者质因子的个数
,最后做一个高精度乘法就好了
③. 学习点
阶乘分解质因数 / 获取n!中质数的个数/ 高精度乘法
④. 代码实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class Main{
/*
* 分解质因数:
C[a][b] = p1^m1 * p2^m2 * … * pk^mk;其中p1~pk都是1~a中的素数;
m1~mk是其中对应的每个素数的次数,是在a中的次数 - b 中的次数 - (a - b)中的次数;
一个技巧就是获得a!的所有质因子,b!的所有质因子,(a-b)!的所有质因子,
然后用a的质因子的个数减去后两者质因子的个数,最后做一个高精度乘法就好了
*/
static int N=100010;
static int[] sum=new int[N];
static int[] primes=new int[N]; //存储所有质数
static boolean[] st=new boolean[N]; //代表这个数是否是质数
static int cnt; //存储质数的个数 从0开始
//线性筛选质数存储到primes[] 数组中
static void get_primes(int x) {
for (int i =2; i <=x; i++) {
if(!st[i]) {
primes[cnt++]=i;
}
for (int j = 0; primes[j]<=x/i; j++) {
st[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
}
}
//获取n!中质数的个数
// 6!阶乘中 质数2的个数
//比如 6 2 ==> res=4
static int get(int n,int p) {
int res=0;
while(n!=0) {
res+=n/p;
n/=p;
}
return res;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
int a = Integer.parseInt(s[0]);
int b = Integer.parseInt(s[1]);
get_primes(a);
for (int i = 0; i <cnt; i++) {
int p=primes[i];
//然后用a的质因子的个数减去后两者质因子的个数
sum[i]=get(a,p)-get(b,p)-get(a-b,p);
}
//将结果进行高精度乘法
//C[a][b] = p1^m1 * p2^m2 * … * pk^mk;其中p1~pk都是1~a中的素数;
BigInteger res = new BigInteger("1");
for (int i = 0; i <cnt; i++) {
int p=primes[i];
for (int j = 0; j <sum[i]; j++) {
res=res.multiply(new BigInteger(String.valueOf(p)));
}
}
System.out.println(res);
}
}