这里的题目意思是 2个或2个以上的数组成的最大共因数是n并且使得这几个数的和最小 例如有两数 a b 不互质 即 gcd(a,b)!=1
假设他们的最小公倍数 lcm(a,b)=n 即 a/gcd(a,b)*b 而a/gcd(a,b) 和n的最小公倍数也为n 反而和更小了 所以 应该取互质的数
这里就要用到唯一分解定理了 其中有一些细节处理见代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1<<31;
int solve(long long & n, int d) {
int x = 1;
while(n % d == 0) { n /= d; x *= d; }
return x;
}
int main(){
//memset(vis,0,sizeof(vis));
int kase=1;
long long n;
while(cin>>n&&n){
long long ans=0;
if(n==1)printf("Case %d: %d\n",kase++,2);
else {
int temp=0;
int m=sqrt(n+0.5);
for(int i=2;i<=m;i++){
if(n%i==0){
temp++;
ans+=solve(n,i);
}
}
if(n!=1||temp==0){//如果n剩余值为素数并且大于 sqrt(n) 则还要除以这个素数才能等于1 或者一直就没有素因子小于sqrt(n)的
temp++;
ans+=n;
}
if(temp==1)ans++;//如果 只有一个素因子就是他本身 还要加上1*n==n 1+n=ans这样得出ans
printf("Case %d: %lld\n",kase++,ans);
}
}
}