AcWing 197. 阶乘分解 (筛法)打卡

给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pipi 和 cici 即可。

输入格式

一个整数N。

输出格式

N! 分解质因数后的结果,共若干行,每行一对pi,cipi,ci,表示含有pciipici项。按照pipi从小到大的顺序输出。

数据范围

1N1061≤N≤106

输入样例:

5

输出样例:

2 3
3 1
5 1

筛法应用:https://www.luogu.org/blog/top-oier/xian-xing-shai-fa-qiu-su-shuo
题意:我们要求一个阶乘里面化成最简质因子相乘的每个质因子个数是多少
思路:我们肯定不能一个一个数单独求,我们应该一个一个范围求质因子个数是多少,我们先用筛法求出给定范围内的质数
然后比如我们要求给定范围的偶数多少个,那其实就是/2即可,能被3取余,4取余也是一样的道理,
又 1-10 取出5个2因子后就变成了 (2 4 6 8 10)/2 -》 (1,2,3,4,5)然后这里可以再出,反复进行这个操作得出有多少个2因子

#include<bits/stdc++.h>
#define maxn 1000005
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int prime[maxn];
int vis[maxn];
int num;
map<ll,ll> mp;
void shai(ll r){
    vis[1]=1;
    for(int i=2;i<=r;i++){
        if(vis[i]==0){
            prime[num++]=i;
            for(int j=2*i;j<=r;j+=i){
                vis[j]=1; 
            } 
        }
    }
}
int main(){
    ll n;
    scanf("%lld",&n);
    shai(n);
    for(int i=0;i<num;i++){
        if(prime[i]>n) break;
        ll w=n;
        ll sum=0;
        while(w){
            sum+=w/prime[i];
            w/=prime[i];
        }
        printf("%lld %lld
",prime[i],sum);
    }
}
原文地址:https://www.cnblogs.com/Lis-/p/10994940.html