【UVA10791】最小公倍数的最小和

题意

输入正整数n(1 ≤ n ≤ 231 − 1),找至少两个数,使得他们的LCM为n且要输出最小的和(看错题哭唧唧)

分析

唯一分解定理模板。

首先要明确分解出来的两个数一定是互质的,如果不互质,肯定会有更优秀的,毕竟还可以约掉一个gcd,比如4和6不如3和4

因此根据唯一分解定理 N=p1c1  *  p2c  *  p3c *……  pnc 

只要乘起来刚好等于N,这些数其实就是pc,于是答案就是p1c1  +  p2c  +  p3c +……  pncn   

代码

  1. #include<bits/stdc++.h>  
  2. using namespace std;  
  3. #define RT register   
  4. #define ll long long  
  5. ll k,cas,ans,num;  
  6. void divide(ll n)  
  7. {  
  8.     ans=0;num=0;  
  9.     ll m=(ll)sqrt((double)n + 10);  
  10.     for(RT ll i=2;i<=m;i++)  
  11.     {  
  12.         if(n%i==0)  
  13.         {  
  14.             int tmp=1;num++;  
  15.             while(n%i==0)  
  16.             {  
  17.                 tmp*=i;  
  18.                 n/=i;  
  19.             }  
  20.             ans+=tmp;  
  21.         }     
  22.     }  
  23.     if(num==0)ans=n+1;  
  24.     else if(num==1||n!=1)ans+=n;  
  25. }  
  26.   
  27. int main()  
  28. {  
  29.     while(scanf("%lld",&k)&&k)  
  30.     {  
  31.         divide(k);++cas;  
  32.         printf("Case %lld: %lld\n",cas,ans);      
  33.     }  
  34. }     
posted @ 2018-10-27 15:12  WJEMail  阅读(238)  评论(0编辑  收藏  举报