[海豹海边爆]AcWing197

原题链接:197. 阶乘分解 - AcWing题库

解题思路:首先,N!等于1-N的每一个数相乘,只要能求出每一个数的质因数即可获得答案。而在1-N中,任何一个数x都拥有N/x个倍数,那么可得出任何一个质数x,在N中也都拥有N/x个倍数。

但有的数字可能包含有多个相同质数,所以还需要对x^2,x^3等也仅需如上操作。

因为能被x^2的数说明至少拥有两个x作为质因数。而由于在N/x的时候我们已经记录过这个数,只需要要累加N/x^2即可,并不需要乘以2。

接着继续获得N/x^2,N/x^3...等数的答案直到x^k>N为止。最终的和就是该质数在N!中作为质因数的总量了。

对小于N的每一个质数进行如上操作,就能解出答案。

AC代码:

#include<bits/stdc++.h>
using namespace std;
long long v[10000000],prime[10000000];//V记录每个数字的最小质因数,prime记录质数 
long long p_length=0;//记录当前质数数量 
long long n;//题目原意
long long ans;//记录质数在N!中的数量 
int main(){
	cin>>n; 
	for(long long i=2;i<=n;i++){//初始化,线性筛 
		if(!v[i]){
			v[i]=i;
			prime[p_length++]=i;
		}
		for(long long j=0;j<p_length;j++){
			if(prime[j]>v[i]||prime[j]*i>n) break;
			v[prime[j]*i]=prime[j];
		}
	}
	for(long long i=0;i<p_length;i++){//遍历每一个质数,查找其在N!中的数量
		long long buffer;//缓存当前质数的值
		buffer=prime[i]; 
		ans=0;
		for(buffer;buffer<=n;){
			ans+=n/buffer;
			buffer*=prime[i];//每次指数增加1 
		}
		cout<<prime[i]<<' '<<ans<<endl;//输出答案 
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值