题目链接:
题意:给一个数 n ,求至少 2个正整数,使得他们的最小公倍数为 n ,而且这些数之和最小。
分析:
利用唯一分解定理:
可以知道,最好是把每一个ai^pi为一个整数;
1、ai^pi不能再分,否则最小公倍数就将小于 n;题目就变成了将 n 唯一分解。
2、由于小于 n 的最大素数是一个界限,不然会超时。处理方案是:m = sqrt(n) + 0.5,最后判断一下 n;或者如上一个题目一样,数据时2^31次方,循环检查到10^5;
3、特例 1,输出2;是素数 n+1;
1 #include2 3 using namespace std; 4 5 int divide_all(int& n,int d) { 6 int x = 1; 7 while(n%d==0) { 8 n/=d; 9 x*=d;10 }11 return x;12 }13 14 long long solve(int n) {15 if(n==1) return 2;16 int m = sqrt(n)+0.5;17 int pf = 0;18 long long ans = 0;19 for(int i=2;i<=m;i++) {20 if(n%i==0) {21 pf++;22 ans+=divide_all(n,i);23 }24 }25 if(n>1) {pf++,ans+=n;}26 if(pf<=1) ans++; //是素数27 return ans;28 }29 30 int main()31 {32 int n;33 int kase=1;34 while(scanf("%d",&n),n) {35 cout<<"Case "< <<": "< <