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, 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 example 12 can be expressed as the
LCM of 1, 12 or 12,
12 or 3, 4 or 4,
6 or 1, 2, 3,
4 etc.

In this problem, you will be given a positive integer N. You have to find out a set of at least two positive integers whose
LCM is N. As infinite such sequences are possible, you have to pick the sequence whose summation of elements is minimum. We will be quite happy if you just print the summation of the elements of this set.
So, for N = 12, you should print 4+3 = 7 as
LCM of 4 and 3 is 12 and
7 is the minimum possible summation.

Input

The input file contains at most 100 test cases. Each test case consists of a positive integer
N ( 1N231
- 1).

Input is terminated by a case where N = 0. This case should not be processed. There can be at most
100 test cases.

Output

Output of each test case should consist of a line starting with `Case
#:
‘ where # is the test case number. It should be followed by the summation as specified in the problem statement. Look at the output for sample input for details.

Sample Input

12
10
5
0

Sample Output

Case 1: 7
Case 2: 7
Case 3: 6

Problem setter: Md. Kamruzzaman

Special Thanks: Shahriar Manzoor


Miguel Revilla 2004-12-10

Source

Root :: AOAPC II: Beginning Algorithm Contests (Second Edition) (Rujia Liu) :: Chapter 10. Maths ::
Examples

Root :: AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 6. Mathematical Concepts and Methods

Root :: AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu) :: Chapter 2. Mathematics ::
Basic Problems

Root :: Competitive Programming 3: The New Lower Bound of Programming Contests (Steven & Felix Halim) :: Mathematics :: Number Theory ::
Working with Prime Factors

Root :: Prominent Problemsetters :: Md. Kamruzzaman (KZaman)

Root :: Competitive Programming 2: This increases the lower bound of Programming Contests. Again (Steven & Felix Halim) :: Mathematics :: Number Theory ::
Working with Prime Factors

思路:分解质因子,将最小公倍数分解质因子,最小的ans便为各个质因子的相应次方数之和。

此题难点较多:

1、当N = 1时,应输出2;

2、当N是素数的时候,输出N+1;

3、当只有单质因子时,sum=质因子相应次方+1;

4、当N=2147483647时,它是一个素数,此时输出2147483648,但是它超过int范围,应考虑用long long。

AC代码:

/*************************************************************************
	> File Name: e.cpp
	> Author: zzuspy
	> Mail: [email protected]
	> Created Time: 2014年12月01日 星期一 19时18分33秒
 ************************************************************************/

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#define LL long long
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
using namespace std;

int main()
{
	int n, cas = 1;
	while(scanf("%d", &n), n)
	{
		int m = (int)sqrt((double)n+0.5);
		int t = n, num = 0;
		LL ans = 0;
		for(int i=2; i<=m; i++)   //分解这个数
			if(t%i == 0)
			{
				num++;   //记录质因子的个数
				int tmp = 1;
				while(t%i==0)
				{
					tmp*=i;
					t/=i;
				}
				ans+=tmp;
			}
		if(n==t)  //本身为素数时
			ans = (LL)n + 1;   //必须要加个(LL)
		else if(num == 1||t!=1)  // 单质因子或是剩下一个大于sqrt(n)的质因子的情况
			ans += t;	// 单质因子情况下t为1,剩余一个大于sqrt(n)质因子时t为剩余质因子
		printf("Case %d: %lld\n", cas++, ans);
	}
	return 0;
}

时间: 2024-10-11 01:33:45

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

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 (数论)

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

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

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

uva 10791 Minimum Sum LCM

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <ma

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

10791 - Minimum Sum LCM

唯一分解定律的应用,任何数都能分解成几个质数相乘的形式,那个质数部分说明了这个质数出现的次数.所以用while()循环来求得各个质数.用k来得出每个小部分.注意到有可能这个数会被一个小质数给除尽,例如n=4,则答案要+1=5 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int ans = 100000; int vis[ans+5]; vector<int> primes; voi

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+=[

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

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