大致题意
给定一个1e10以内的正整数a,试着求初出这样一串数列,它们的最小公倍数为a,输出这个数列元素和的最小值(元素数量至少为2)。
解题思路
很明显最终答案的元素中,任意两个元素的最大公约数都要是1,否则肯定存在另一个和更加小的数列,所以当我们把a分解成多个质数相乘时,必须要把相同的数乘在一起合并为一个数,另外还要处理一些特殊情况比如a=1,a为质数等等。
AC代码
#include<iostream> #define ll long long using namespace std; int main() { ll int a,ans1,ans2,b=1,i,N,pan; while(1) { scanf("%lld",&a); ans1=0; ans2; pan; N=a; if(a==0) break; for(i=2;i<=a;i++) { pan=0; for(;i*i<a;i++) { if(a%i==0) { pan=1; break; } } if(pan==1) { a=a/i; ans2=i; for(;;) { if(a%i==0&&a>=2) { a=a/i; ans2=ans2*i; } if(a%i!=0||a<2) break; } ans1=ans1+ans2; } else { ans1+=a; break; } } if(ans1==N) ans1++; if(N==1) ans1=2; printf("Case %d: %lld\n",b++,ans1); } }