UVA10791

思路:分解质因数。

分解质因数后答案就是各个质因数(次方)的和;

假设两个数a,b,最小公倍数是a*b/gcd(a,b);那么他们的和为a+b,那么a/gcd(a,b)(假设a/gcd(a,b)是那个与另一个数互质 的数 ),和b的最小公倍数也和a,b相同,然后他们是互质的,那么他们的和明显小。

所以当一个数,我们把它分解为a1^x1+a2^x2+a3^x3...,那么我们知到a1^x1,a2^x2..这些数的最小公倍数是n,然后各个互质,我们可以知道a1^x1,a2^x2,可以的到最小公倍数c1,并且a1^x1+a2^x2是最小的,同时这个公倍数与下面的数互质,然后再与下项求,。。。。。一直到最后都是最优的 。

 

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<stdlib.h>
 4 #include<iostream>
 5 #include<queue>
 6 #include<math.h>
 7 #include<map>
 8 #include<vector>
 9 #include<string.h>
10 typedef long long LL;
11 using namespace std;
12 bool prime[100000];
13 int ans[100000];
14 int main(void)
15 {
16         int i,j;
17         for(i = 2; i < 1000; i++)
18         {
19                 if(!prime[i])
20                 {
21                         for(j = i; (i*j) <= 100000; j++)
22                         {
23                                 prime[i*j] = true;
24                         }
25                 }
26         }
27         int cn = 0;
28         for(i = 2; i < 100000; i++)
29         {
30                 if(!prime[i])
31                 {
32                         ans[cn++] = i;
33                 }
34         }
35         int __ca = 0;
36         int n;
37         int ak = 1;
38         int flag = 0;int p = 0;
39         while(scanf("%d",&n),n!=0)
40         {      LL sum = 0;int m = n;
41                 int f = 0;ak = 1;flag = 0;
42                 p = 0;
43                 while(n > 1)
44                 {
45                         while(n%ans[f]==0)
46                         {       if(flag == 0)p++;
47                                 flag  = 1;
48                                 ak*=ans[f];
49                                 n/=ans[f];
50                         }
51                         if(flag) sum += ak;
52                         flag  = 0;
53                         f++;ak = 1;
54                         if((LL)ans[f]*(LL)ans[f] > n)
55                             break;
56                 }
57                 if(n > 1)
58                 {
59                     p++;
60                     sum += n;
61                 }if(m==1)sum = 2;
62                 printf("Case %d: ",++__ca);
63                 if(p==1)sum+=1;
64                     printf("%lld\n",sum);
65         }
66         return 0;
67 }

 

转载于:https://www.cnblogs.com/zzuli2sjy/p/5858351.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值