一道简单数论题,前几周某场牛客周赛刚学的。任何一个数都符合"唯一分解定理",可以分解为有限个质数幂次的乘积形式,假设是样例: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;
}

京公网安备 11010502036488号