Acwing---888. 求组合数 IV (Java)_数学知识_对阶乘分解质因数_高精度乘法

原题链接

①. 题目

在这里插入图片描述

②. 思路

在这里插入图片描述

分解质因数

  • 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);
	}
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45480785/article/details/113915039