UVA 10791 最小公倍数的最小和
来源:互联网 发布:windows 8.1系统镜像 编辑:程序博客网 时间:2024/06/07 00:15
题意:
输入整数n,求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小。输出最小的和。
参考:http://blog.csdn.net/mengxingyuanlove/article/details/47377657
题解:
我们可以想象假如使整数和最小的且最小公倍数为n的数由x1,x2···,xm这些数组成,如果其中任意两个数有相同的约数,那么我们可以将其中一个除去约数,将使整体的和更小。因此可以肯定x1,x2···xm相互之间没有约数。将n转换为质数相乘的形式,可以发现当其中的每一个项作为一个x1,x2···xm中的一个数时能使整体和最小。因此我们可以把n运用唯一分解定理进行分解,将其中的每一项相加即可。
注意:
1、n的取值范围为2^31,因此我们只需要筛选出2^16 次方以内的素数即可,然后对n进行分解,如果分解结束后n>1,则证明现在的n是一个素数,而且这个素数大于2^16,且只有一次。因此将其加到结果上就行
(分解质因数试除法,枚举到根号n即可)
2、如果分解后只有一项,我们需要对结果再加1,凑够两项
3、小心溢出的情况(2^31-1)
欧拉筛+快速幂+分解质因数
代码:
#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 65536;int e[maxn+1];int prime[maxn+1];int nprime;void getPrime(){ int m=sqrt(maxn+0.5); memset(prime,0,sizeof(prime)); for(int i=2;i<=m;++i) if(!prime[i]) for(int j=i*i;j<=maxn;j+=i) prime[j]=1; nprime=0; for(int i=2;i<=maxn;++i){ if(!prime[i]) prime[nprime++]=i; }}int pows(int a,int b){ int tmp=1; if(b==0) return 1; if(b==1) return a; tmp*=pows(a,b/2); tmp*=tmp; if(b%2) tmp*=a; return tmp;}LL getFactors(LL n){ memset(e,0,sizeof(e)); int cnt=0; for(int i=0;i<nprime&&n>=prime[i];i++) { if(n%prime[i]==0) cnt++; while(n%prime[i]==0) { n/=prime[i]; e[i]++; } if(n==1) break; } LL ans=0; for(int i=0;i<nprime;i++) { if(e[i]) ans+=pows(prime[i],e[i]); } if(n>1) { ans+=n; cnt++; } if(cnt==1) return ans+1; return ans;}int main(){ int k=1; LL n; getPrime(); while(cin>>n&&n) { if(n==1) {printf("Case %d: %d\n",k++,2);continue;} LL ans = getFactors(n); printf("Case %d: %lld\n",k++,ans); } return 0;}
阅读全文
0 0
- uva 10791 最小公倍数的最小和
- 【UVA 10791】最小公倍数的最小和
- UVA 10791 最小公倍数的最小和
- 例题10-4 UVA 10791 Minimum Sum LCM (最小公倍数的最小和)
- 筛法求素数,唯一分解定理(最小公倍数的最小和,uva 10791)
- 最小公约数和最小公倍数
- uva 10791 LCM的最小和
- uva 10791 和最小的LCM
- 例题10-4 最小公倍数的最小和 UVa10791
- 求两个数的最小公约数和最小公倍数
- UVa 10791 和最小的LCM (质因数分解)
- 最小公倍数 求两个数字的最小公倍数是很常见的运算。比如,3和5的最小公倍是15。6和8的最小公倍数是24。
- 关于求两个数的最小公约数和最小公倍数问题【经典算法】!
- 线性计算给定两个自然数的最大公因子,最小公倍数和最小自然数比
- 例题10-4 UVa10791 Minimum Sum LCM(最小公倍数的最小和)
- uva 11388 最大公约数与最小公倍数的关系
- OJ刷题之最小公倍数和最小公约数
- 辗转相除法求最小公约数和最小公倍数
- 内核源码阅读(九)进程优先级处理
- effective C++ 条款十三解读
- 清华梦的粉碎—写给清华大学的退学申请 /王垠
- 洛谷 1387最大正方形
- Codeforces
- UVA 10791 最小公倍数的最小和
- 3.ARMv8 中断及异常处理(包括系统调用,系统调用即同步异常)
- Binder线程池
- 3.Spark-RDD原理
- zzuli 2179: 紧急营救
- 《leetcode》single-number-ii
- 逆序对
- 原码、反码、补码以及补码是怎么来的
- 最大的最大公约数