zoukankan      html  css  js  c++  java
  • 题解 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);
    	}
    }
    
  • 相关阅读:
    java使用递归删除非空目录
    关于Java日期的两道例题
    equals和==的区别
    从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
    输出所有的水仙花数
    99乘法表
    switch
    next()、nextInt()
    流程控制
    Scanner从键盘输入
  • 原文地址:https://www.cnblogs.com/whx1003/p/11964885.html
Copyright © 2011-2022 走看看