[acwing]阶乘分解-线性筛

题目
就是给你\(n\)让你把\(n!\)分解质因数。
当然直接乘起来再分解是不可能的,我们需要更快的算法。
首先用欧拉筛筛出\(1-n\)所有的素数,不难发现,对于每个素数,在\(n!\)里面出现了

\[\sum_{p^k\leq n} \lfloor \frac{n}{p^k} \rfloor \]


直接套公式即可

#include <iostream>
#include <cstdio>

using namespace std;
const int N=1e6+5;
int prime[N],cnt,n;
bool isp[N];
int c[N];

void sieve(int n) {
	isp[0]=isp[1]=true;
	for(int i=2;i<=n;i++) {
		if(!isp[i])
		  prime[++cnt]=i;
		for(int j=1;j<=cnt and prime[j]*i<=n;j++) {
			isp[prime[j]*i]=true;
			if(i%prime[j]==0)
			  break;
		}
	}
}

int main() {
	cin>>n;
	sieve(n);
	for(int i=1;i<=cnt;i++) {
		long long l=prime[i];
		while(l<=n) {
			c[i]+=n/l;
			l*=prime[i];
		}
	}
	for(int i=1;i<=cnt;i++)
	  cout<<prime[i]<<' '<<c[i]<<endl;
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/wyc06/p/13198148.html