UVA 10791 (唯一分解定理)

記錄一下唯一分解定理的應用

#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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章