码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-10-27 16:09:24      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:alt   一个   tmp   gcd   clu   tar   ++   ring   div   

题意

输入正整数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. }     

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

标签:alt   一个   tmp   gcd   clu   tar   ++   ring   div   

原文地址:https://www.cnblogs.com/NSD-email0820/p/9859975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!