#eratosthenes#CH 3101 阶乘分解

本文介绍了一种高效算法用于将N的阶乘进行质因数分解,避免了传统试除法的高时间复杂度。通过质数筛法,文章详细阐述了如何计算每个质数在N!中出现的次数,提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

N!N!N!质因数分解


分析

直接1到NNN试除法O(NN)O(N\sqrt N)O(NN),是会超时的,所以就尝试用质数筛一筛,那么对于每个质数p,个数就是∑pk≤n⌊Npk⌋\sum_{p^k\leq n}\lfloor \frac{N}{p^k}\rfloorpknpkN


代码

#include <cstdio>
int n,ans; bool v[501001]; long long t=2;
void print(int ans){if (ans>9) print(ans/10); putchar(ans%10+48);}
int main(){
	scanf("%d",&n);
	while (t<=n) ans+=n/t,t<<=1;
	putchar('2'); putchar(' '); 
	print(ans); putchar('\n'); ans=0;
	for (register int i=1;i<=n-1>>1;i++)
	if (!v[i]){
		t=i<<1|1; ans=0;
	    while (t<=n) //求答案
		    ans+=n/t,t=t*(i<<1|1);
	    print(i<<1|1); putchar(' ');
		print(ans); putchar('\n');
	    	for (register int j=i;j<=n/(i<<1|1)>>1;j++)
		    	v[(i<<1|1)*(j<<1|1)>>1]=1;//神奇的筛法
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值