大致题意
给定一个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);
}
}
本文介绍了一种算法,该算法接受一个不超过1e10的正整数a,并找出一个数列,使得这些数的最小公倍数恰好等于a。文章详细解释了解决方案的过程,包括如何分解质因数并将相同质因数合并以得到数列元素和的最小值。
380

被折叠的 条评论
为什么被折叠?



