• 题意:给定N(1<=N<=1e6),将N!分解质因数以及质因数个数,输出分解结果
  • 题解:
    • 直接分解显然会炸
    • 于是我们可以先筛出小于N的所有质数
    • 对于每个质因子p,1~N中包含一个p的数有[N/p]个,包含两个的有[N/p^2]个…
    • 由于后一包含前一,所以总共有个质因子p
    • O(NlogN)
  • //#include<bits/stdc++.h>
    #include<algorithm>
    #include <iostream>
    #include  <cstdlib>
    #include  <cstring>
    #include  <cassert>
    #include   <cstdio>
    #include   <vector>
    #include   <string>
    #include    <cmath>
    #include    <queue>
    #include    <stack>
    #include      <set>
    #include      <map>
    using namespace std;
    #define P(a,b,c) make_pair(a,make_pair(b,c))
    #define rep(i,a,n) for (int i=a;i<=n;i++)
    #define per(i,a,n) for (int i=n;i>=a;i--)
    #define CLR(vis) memset(vis,0,sizeof(vis))
    #define MST(vis,pos) memset(vis,pos,sizeof(vis))
    #define pb push_back
    #define mp make_pair
    #define all(x) (x).begin(),(x).end()
    #define fi first
    #define se second
    #define SZ(x) ((int)(x).size())
    typedef pair<int,pair<int,int> >pii;
    typedef long long ll;
    typedef unsigned long long ull;
    const ll mod = 1000000007;
    const int INF = 0x3f3f3f3f;
    ll gcd(ll a, ll b) {
    	return b ? gcd(b, a%b) : a;
    }
    template<class T>inline void gmax(T &A, T B) {
    	(A<B)&&(A=B);//if(B>A)A=B;
    }
    template<class T>inline void gmin(T &A, T B) {
    	(A>B)&&(A=B);//if(B<A)A=B;
    }
    template <class T>
    inline bool scan_d(T &ret) {
    	char c;
    	int sgn;
    	if(c=getchar(),c==EOF) return 0; //EOF
    	while(c!='?'&&(c<'0'||c>'9')) c=getchar();
    	sgn=(c=='?')?-1:1;
    	ret=(c=='?')?0:(c-'0');
    	while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    	ret*=sgn;
    	return 1;
    }
    inline void outt(int x) {
    	if(x>9) outt(x/10);
    	putchar(x%10+'0');
    }
    const int maxn=1e6+10;
    int vis[maxn];
    struct node{
    	ll prime;
    	ll cnt;
    }P[maxn];
    int cnt;
    void init(int n){
    	vis[1]=1;
    	cnt=0;
    	rep(i,1,n){
    		if(!vis[i]){
    			P[++cnt].prime=i;
    			P[cnt].cnt=0;
    			for(int j=i*2;j<=n;j+=i){
    				if(!vis[j])vis[j]=1;
    			}
    		}
    	}
    }
    int main(){
    	
    	int n;
    	scanf("%d", &n);
    	init(n);
    	rep(i,1,cnt){
    		ll base=P[i].prime;
    		ll num=base;
    		while(num<=n){
    			P[i].cnt+=n/num;
    			num*=base;
    		}
    	}
    	rep(i,1,cnt){
    		printf("%lld %lld",P[i].prime,P[i].cnt);
    		if(i!=cnt)puts("");
    	}
    	return 0;
    }
    

 

发表评论

邮箱地址不会被公开。 必填项已用*标注