[质因数分解]UVa10791 Minimum Sum LCM

题目大意

输入整数n (1<=n<2^31),求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小,输出最小的和。

(LRJ小紫书P317页例题)

思考

看LRJ的分析没怎么看懂,随手搜了一篇题解。发现了一个讲的不错的,让我恍然大悟。

题解地址

首先假设我们知道了一系列数字a1,a2,a3……an,他们的LCM是n,那么什么时候他们是最优解呢,当他们两两互质的时候。

简单证明一下:

设两个正整数为a,b (a<=b) 其gcd(a,b)=n lcm(a,b)=m  sum = a + b

如果n!=1(a,b不互质) 那么我们在m不变的情况下 优化一下 a = a / n

那么a变小后,sum必然减少。

那我们怎么保证两两互质呢?方法其实很简单,直接分解质因子。

所以我们已经得到了这个问题的解法

1.将一个数分解成质因子,将相同的因子乘起来作为一个处理后的因子

2.将处理后得到的多个因子直接相加就是答案

3.因为题目说只要需要两个数字,所以对于1和素数我们需要小心。对于素数,我们只能分解出一个因子就它自己,对于1一个因子都分解不出来(我们不把1当做因子),他们的答案都是n+1,因为只有1和n的LCM是n 。

#include <cstdio>
#include <iostream>
#include <cmath>
typedef long long ll;

ll f[233],Count,n,ans;

void init(ll n){
    ll m = (ll)sqrt(n+1);
    Count=0;
    for(ll i=2;i<=m && n>1 ;i++){
        if(!(n%i)){
            ll fac=1;
            while(!(n%i) && n>1){
                fac*=i;
                n/=i;
            }
            f[Count++] = fac;
            //printf("Run\n");
        }
    }
    if(n>1) f[Count++]=n;
}

int main(){
    int Case=0;
    while(scanf("%d",&n) && n!=0){
        ans=0;
        init(n);
        //printf("%d\n",Count);
        if(!Count || Count==1) ans=n+1;
        else for(int i=0;i<Count;i++) ans+=f[i];
        printf("Case %d: %lld\n",++Case,ans);
    }
    return 0;
}
时间: 2024-08-02 11:03:43

[质因数分解]UVa10791 Minimum Sum LCM的相关文章

UVa10791 - Minimum Sum LCM

分析即为紫薯上的分析. 难点是发现当每个aipi作为一个单独的整数时才最优.. 答案就是将所有不同的 相同因子的积 相加即可 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<queue> #include<map> #in

Minimum Sum LCM(uva10791+和最小的LCM+推理)

L - Minimum Sum LCM Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 10791 题意:输入正整数n,<注意n=2^31-1是素数,结果是2^31已经超int,用long long,>找至少两个数,使得他们的LCM为n且要输出最小的和: 思路:既然LCM是n,那么一定是n的质因子组成的数,又要使和最小,那么就是ans+=[

UVA - 10791 - Minimum Sum LCM (数论相关!)

题目链接:Minimum Sum LCM UVA - 10791 Minimum Sum LCM Time Limit:3000MS   Memory Limit:Unknown   64bit IO Format:%lld & %llu SubmitStatus Description  Minimum Sum LCM  LCM (Least Common Multiple) of a set of integers is defined as the minimum number, whic

uva 10791 Minimum Sum LCM ( 唯一分解定理 )

使用唯一分解定理的时候不一定要打出素数表,这句话是相对上一篇来讲的.做这道题目之前我对唯一分解定理方法的理解不完全. 现在多想到了一些 唯一分解,将当前需要分解的n用因子将其分解表达.需要试因子. 因子的枚举应该是从2开始(从1开始没有意义),当当前数字n可以整除当前因子i时,就使其不断除以i,直到不能整除. 这个步骤实际上已经在根本上避免了出现像4.6这种因子在唯一分解式中的出现--之前的因子2和3已经将其代替了.所以可证明唯一分解时并不一定需要构造素数表 针对本题来说,最小公倍数的最小和,有

UVA 10791 Minimum Sum LCM (数论)

LCM (Least Common Multiple) of a set of integers is defined as the minimum number, which is a multiple of all integers of that set. It is interesting to note that any positive integer can be expressed as the LCM of a set of positive integers. For exa

Minimum Sum LCM(uva 10791)

题意(就是因为读错题意而wa了一次):给一个数字n,范围在[1,2^23-1],这个n是一系列数字的最小公倍数,这一系列数字的个数至少为2 例如12,是1和12的最小公倍数,是3和4的最小公倍数,是1,2,3,4,6,12的最小公倍数,是12和12的最小公倍数……………… 那么找出一个序列,使他们的和最小,上面的例子中,他们的和分别为13,7,28,24……显然最小和为7 /* 我们很容易可以发现,将n唯一分解之后,把所有质因数乘以次数加起来就行了.比如:12=2^2*3^1,那么ans=2^2

UVA 10791 Minimum Sum LCM 数论

题目链接: https://vjudge.net/problem/UVA-10791 题目描述: 给一个数n, 让你求至少两个数的lcm是n 的, 最小和 解题思路: 唯一分解, 每个单独的素数的幂加起来就是答案 代码: #include <iostream> #include <cstdio> #include <string> #include <vector> #include <cstring> #include <iterator

UVa 10791 (唯一分解) Minimum Sum LCM

题意: 输入n,求至少两个正整数,使得这些数的最小公倍数为n且和最小. 分析: 设n的分解式为,很显然单独作为一项,和最小. 这里有两个小技巧: 从2开始不断的除n,直到不能整除为止.这样就省去了素数判断的问题,而且缩短了代码量.因为最开始把所有n的2的因数都出去了,后面便不会出现n % 4 == 0的情况,这样除n的都是素数. 从2除n一直到sqrt(n),如果n不为1,则此时除“剩下”的就是n最大的质因数.减少循环次数. 1 #include <cstdio> 2 #include <

UVA - 10791 Minimum Sum LCM(最小公倍数的最小和)

题意:输入整数n(1<=n<231),求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小.输出最小的和. 分析: 1.将n分解为a1p1*a2p2--,每个aipi作为一个单独的整数时最优. 2.n为1时,len==0:n为素数时,len==1. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #includ