UVA-10791 数学
Posted LuZhiyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA-10791 数学相关的知识,希望对你有一定的参考价值。
题意:
输入n (1<=n<2^31) 求至少两个正整数使得他们的lcm等于n并且他们的和最小,输出最小和
代码:
// a*b=lcm*gcd => a=lcm*gcd/b; a+b=b+lcm*gcd/b 显然gcd越小a+b就越小,即gcd=1,所以几个数 // 互质时他们的和最小。求n的所有的质因子求和。 // 题目要求至少两个数所以要注意n==1和n只有一种质因子的情况。 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; typedef long long ll; ll solve(ll n){ ll nn=n,ans=0; int m=sqrt(n+0.5),cnt=0; for(int i=2;i<=m;i++){ if(n==1) break; if(n%i==0){ cnt++; ll tmp=1; while(n%i==0){ tmp*=i; n/=i; } ans+=tmp; } } if(n>1) ans+=n; if(cnt==1&&n==1) ans++;//只有一种素因子的情况 if(n==nn) ans=n+1;//n是素数的情况 return ans; } int main() { ll n; int cas=0; while(scanf("%lld",&n)==1&&n){ ll ans=solve(n); if(n==1) ans=2; printf("Case %d: %lld\n",++cas,ans); } return 0; }
以上是关于UVA-10791 数学的主要内容,如果未能解决你的问题,请参考以下文章