题解 UVa10791

Posted whx1003

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 UVa10791相关的知识,希望对你有一定的参考价值。

题目大意 多组数据,每组数据给出一个正整数 (n),请求出一组数 (a_1cdots a_m),满足 (LCM_{k=1}^ma_k=n)(sum_{k=1}^ma_k) 最小。

分析 我们以两个数为例进行研究。假定 (LCM(a,b)=n) 则如果 (GCD(a,b) eq 1),有 (LCM(frac{a}{gcd(a,b)},b)=n),且 (a+b>frac{a}{gcd(a,b)}+b)。故当且仅当 (gcd(a,b)=1) 时最优。而对于多个数的情况,也是当且仅当 (prod_{k=1}^ma_k=n) 时最优。而对于正整数 (a_1geq 2,a_2geq2,cdots,a_mgeq2),总有 (sum_{k=1}^ma_kleq prod_{k=1}^ma_k)。所以如果可以将 (n) 质因数分解为 (n=prod_{k=1}^mp_k^{q_k})(其中 (forall iinmathbb{N+},p_i) 为质数),则当且仅当 (forall iinmathbb{N+},a_i=p_i^{q_i}) 时有最优解。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

ll t, tot, n, ans;
map<ll, ll> m;

ll QuickPow(ll a, ll b)
{
    ll res = 1;
    while(b) {
        if(b & 1) res *= a;
        a = a * a, b >>= 1;
    }
    return res;
}

int main()
{
    while(~scanf("%lld", &n) && n) {
        m.clear(), ans = 0, tot = 0;
        
        for(ll i = 2; i * i <= n && n > 1; ++i)
            while(n % i == 0) ++m[i], n /= i;
        if(n > 1) m[n] = 1;
        
        map<ll, ll>::iterator it = m.begin();
        while(it != m.end()) {
            ans += QuickPow(it->first, it->second);
            ++it, ++tot;
        }
        
        if(tot < 2) ans += 2 - tot;
        printf("Case %lld: %lld
", ++t, ans);
    }
}

以上是关于题解 UVa10791的主要内容,如果未能解决你的问题,请参考以下文章

UVA-10791 数学

UVA 10791 Minimum Sum LCM 数论

UVA 10791 Minimum Sum LCM

UVA 10791

UVA 10791 -唯一分解定理的应用

UVa 10791 最小公倍数的最小和(唯一分解定理)