找n!中p为因数次数
打质数表
对于每个质数p
(向下取整)
代码:
#include <bits/stdc++.h>
using namespace std;

const int N=1e6+6;
int prime[N],mi[N],cnt,tmp,n,p;
bool st[N];

void mTable(int n){
	for(int i=2;i<=n;i++){
		if(!st[i]) prime[cnt++]=i;
		for(int j=0;prime[j]<=n/i;j++){
			st[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}
}

int main(int argc, char** argv) {
	cin>>n;
	mTable(n);
	for(int i=0;i<cnt;i++){
		p=prime[i];
		tmp=n;
		while(tmp) mi[i]+=tmp/p, tmp/=p;
	}
	for(int i=0;i<cnt;i++){
		printf("%d %d\n",prime[i], mi[i]);
	}
	return 0;
}