1295. X的因子链(线性筛法求素数\算术基本定理)

1295. X的因子链

#include <bits/stdc++.h>
using namespace std;

const int N = (1 << 20) + 10;

int fact[30], sum[N]; //fact存储质因子,sum存储质因子的个数
int primes[N], cnt, minp[N]; //minp存储每个数的最小质因子
bool st[N];

void get_primes(int n) {
    for(int i = 2; i <= n; ++i){
        if(!st[i]) {primes[cnt++] = i; minp[i] = i;}
        for(int j = 0; primes[j]  * i <= n; ++j){
            int t = primes[j] * i;
            st[t] = true;
            minp[t] = primes[j];
            if(i % primes[j] == 0) break;// 通过最小质因子来筛
        }
    }   
}

signed main(){
    get_primes(N);
    int x;
    while(cin >> x){
        int total = 0, k = 0;
        while(x > 1){
            int p = minp[x];
            fact[k] = p, sum[k] = 0;
            while(x % p == 0){
                sum[k]++;
                total++;
                x /= p;
            }
            ++k;
        }
        long long res = 1;
        for(int i = 1; i <= total; ++i) res *= i;
        
        for(int i = 0; i < k; ++i){
            for(int j = 1; j <= sum[i]; ++j){
                res /= j;
            }
        }
        cout << total << " " << res << endl;
    }
    
    return 0;
}
posted @ 2025-03-31 20:48  awei040519  阅读(74)  评论(0)    收藏  举报