【題解】Kattis: Non-Prime Factors

範例】最大質因數建表
【題目敘述https://open.kattis.com/problems/nonprimefactors

  • 先建表:找出所有數的最大質因數。
  • 對輸入的數進行質因數分解,從其最大質因數開始。
  • 【例】
    • 100 = 5^2 * 2^2 (100 有兩個質因數:5 和 2。)
    • 可知 100 有 (2+1)*(2+1) = 9 個因數:1, 2, 4, 5, 10, 20, 25, 50, 和 100。
    • 其中,2 和 5 是質數。因此,100 有 9 – 2 = 7 個非質數的因數。
#include <iostream>
using namespace std;

const int maxn = 2000005;
int mx_prime[maxn];

void tbl_mx_prime(){
    // 建表:找出所有數的最大質因數
    mx_prime[0] = 0;
    mx_prime[1] = 1;
    for (int i=2; i<maxn; i++){
        if (mx_prime[i] > 0) continue;
        for (int j=i; j<maxn; j+=i){
            mx_prime[j] = i;
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int Q, N;
    
    tbl_mx_prime();
    
    cin >> Q;
    while (Q--){
        cin >> N;
        int last_pf = 0; //前一個質因數
        int n_pf = 0; //可分解成幾種質因數的連乘積
        int cnt = 0; //連續質因數的個數
        int ans = 1;
        // 質因數分解,e.g. 100 = 2^2 * 5^2
        // 共有(2+1)*(2+1)個因數,其中有兩個是質因數
        while (N > 1){
            if (mx_prime[N] == last_pf) cnt++;
            else {
                ans *= (cnt + 1);
                last_pf = mx_prime[N];
                n_pf++;
                cnt = 1;
            }
            N /= mx_prime[N];
        }
        ans *= (cnt + 1);
        cout << ans - n_pf << '\n';
    }
    return 0;
}
分享本文 Share with friends