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

题意:求阶乘的算术基本定理

思路

数值较大的质因数分解用质因数分解模板不一定时间够用

可以先枚举质数,对每个质数遍历,求解每个质数的倍数,质数幂次的倍数,然后加和作为算术基本定理中的指数大小

这种方法局限在数可以拆为多个数字相乘,可以转化为求各个数中质数的倍数的问题

实现

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_map>
#include <map>
 
using namespace std;
 
typedef long long LL;
 
const int N = 1000010;
 
LL n;
LL primes[N];
int cnt;
bool st[N];
 
 
void get_primes(int n)
{
    for(int i = 2; i <= n; i ++)
    {
        if(!st[i]) primes[cnt ++] = i;
        for(int j = 0; primes[j] * i <= n; j ++)
        {
            st[primes[j] * i] = true;
            if(i % primes[j] == 0) break;
        }
    }
}
 
 
int main()
{
    cin >> n;
    
    get_primes(n);
    
    for(int j = 0; j < cnt; j ++)
    {
        int p = primes[j];
        int t = n / p;
        
        int s = 0;
        while(t) s += t, t /= p;
        
        cout << p << ' ' << s << endl;
    }
    
    return 0;
}