大致题意
给定一个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);
}
}