UVA 10791 (唯一分解定理)
阿新 • • 發佈:2019-01-29
記錄一下唯一分解定理的應用
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <cmath>
#define LL long long
#define INF 0x3f3f3f3f
#define mod 1000000007
const int maxn = 1000000 + 5;
using namespace std;
LL a[maxn];
int solve(LL n){
int cnt = 0;
if(n == 1) return 1;
LL m = (int)sqrt(n+0.5);
for(LL i=2; i<=m; i++){
if(n % i == 0){
LL ans = 1;
while(n % i == 0){
n /= i;
ans *= i;
}
a[cnt++] = ans;
}
}
if (n > 1) a[cnt++] = n;
return cnt;
}
int main(){
LL n;
int kases = 1;
while(scanf("%lld",&n) == 1 && n){
LL ans = 0;
int sum = solve(n);
if(sum == 1){
ans = n + 1;
}
else{
for(int i=0; i<sum; i++)
ans += a[i];
}
printf ("Case %d: %lld\n",kases++,ans);
}
}