例10-4 uva10791(唯一分解)

时间:2022-10-15 00:08:23

题意:求最小公倍数为n的数的和的最小值。

如12:(3,4),(2,6),(1,12)最小为7

要想a1,a2,a3……an的和最小,要保证他们两两互质,只要存在不互质的两个数,就一定可以近一步优化

只是当n=1时,答案为2,而且可能会超,要用long long       /*脑子一抽输出用了I64d,不停wr,好坑

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll que[1000];
ll len; void fin(ll n)
{
ll m = (ll)sqrt(n+0.5);
for(ll i = 2; i <= m && n > 1; i++)
{
if(n % i == 0)
{
ll tmp = 1;
while(n % i == 0 && n > 1)
{
n/=i;
tmp *= i;
}
que[len++] = tmp;
}
}
if(n > 1)
que[len++] = n;
} int main()
{
ll n,ans;
int cas = 1;
while(~scanf("%lld",&n) && n)
{
printf("Case %d: ",cas++);
len = ans = 0;
fin(n);
if(len == 0 || len == 1)
ans = n+1;
else
{
for(int i = 0; i < len; i++)
ans += que[i];
}
printf("%lld\n",ans);
}
return 0;
}