一道简单数论题,前几周某场牛客周赛刚学的。任何一个数都符合"唯一分解定理",可以分解为有限个质数幂次的乘积形式,假设是样例:12-----> 2*2*3,就是由质数2和3组成,那么将这些质数相加就是答案(唯一分解后乘上1么hhh,这个就不多说了),所以这题对于每个数的答案就是唯一的。我这里写了质数筛。附上苯环大人出的周赛原题:

https://ac.nowcoder.com/acm/contest/128678/C

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
const int maxn=300000;
//唯一分解定理
//任何数都可以分解成有限个质数的幂次乘积
bool isPrime[maxn+10];
vector<int>Prime;
void solve(){
    int n;
    cin>>n;
    int sum=0;
    for(int i=0;i<Prime.size();++i){
        while(n%Prime[i]==0){
            sum+=Prime[i];
            n/=Prime[i];
        }
    }
    cout<<sum<<'\n';
}

signed main(){
    IOS;
    for(int i=0;i<=maxn;++i){
        isPrime[i]=true;
    }
    isPrime[0]=isPrime[1]=false;
    for(int i=2;i*i<=maxn;++i){
        if(isPrime[i]){
            for(int j=i*i;j<=maxn;j+=i){
                isPrime[j]=false;
            }
        }
    }
    for(int i=0;i<=maxn;++i){
        if(isPrime[i])Prime.push_back(i);
    }
    solve();
    return 0;
}