例题10-4 最小公倍数的最小和 UVa10791

1.题目描述:点击打开链接

2.解题思路:本题要求找至少两个整数,使得它们的最小公倍数是n。本题看似简单,但还是应该注意细节,考虑周密。当n=1时答案是2,当n只有一种素因子时答案是n+1,由于n的最大范围是2^31-1,因此保险起见用long long防止溢出。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

typedef long long LL;
const int maxn = 1000000;
int vis[maxn];
int e[maxn];
vector<LL>primes;
void init()
{
	int m = sqrt(maxn + 0.5);
	for (int i = 2; i <= m;i++)
	if (!vis[i])
	for (int j = i*i; j <= maxn; j+=i)
		vis[j] = 1;
	for (int i = 2; i <= maxn;i++)
	if (!vis[i])
		primes.push_back(i);
}
bool is_prime(LL n)
{
	if (n <= maxn)
	{
		if (!vis[n])return true;
		else return false;
	}
	int m = sqrt((double)n + 0.5);
	for (int i = 0; i < primes.size(); i++)
	{
		if (primes[i]>m)break;
		if (n%primes[i] == 0)return false;
	}
	return true;
}

void solve(LL n)
{
	LL tmp = n;
	int cnt = 0;
	for (int i = 0; i < primes.size(); i++)
	{
		int ok = 0;
		while (tmp%primes[i] == 0)
		{
			ok = 1;
			tmp /= primes[i];
			e[i]++;
		}
		if (ok)cnt++;
	}
	if (cnt == 1)cout << n + 1 << endl;
	else if (cnt > 1)
	{
		LL sum = 0;
		for (int i = 0; i <= maxn;i++)
		if (e[i] > 0)
			sum += pow(primes[i], e[i]);
		cout << sum << endl;
	}
}
int main()
{
	//freopen("test.txt", "r", stdin);
	LL n;
	int rnd = 0;
	init();
	while (scanf("%lld", &n) != EOF&&n)
	{
		memset(e, 0, sizeof(e));
		printf("Case %d: ", ++rnd);
		if (n == 1)cout << 2 << endl;
		else
		{
			if (n <= maxn&&!vis[n])
				cout << n + 1 << endl;
			bool ok = is_prime(n);
			if (n > maxn&&ok)
				cout << n + 1 << endl;
			if (!ok)
				solve(n);
		}
	}
	return 0;
}
时间: 2024-08-02 11:01:35

例题10-4 最小公倍数的最小和 UVa10791的相关文章

【UVA10791】最小公倍数的最小和

题意 输入正整数n(1 ≤ n ≤ 231 − 1),找至少两个数,使得他们的LCM为n且要输出最小的和(看错题哭唧唧) 分析 唯一分解定理模板. 首先要明确分解出来的两个数一定是互质的,如果不互质,肯定会有更优秀的,毕竟还可以约掉一个gcd,比如4和6不如3和4 因此根据唯一分解定理 N=p1c1  *  p2c2   *  p3c3  *……  pncn    只要乘起来刚好等于N,这些数其实就是pc,于是答案就是p1c1  +  p2c2   +  p3c3  +……  pncn    代

UVa 10791 最小公倍数的最小和(唯一分解定理)

https://vjudge.net/problem/UVA-10791 题意: 输入整数n,求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小. 思路: 首先对n进行质因数分解,举个例子来说,12=2×2×3,最小和为7,也就是4和3,相同质因子必须放在一起,也就是说这里的2个2必须合在一起变成4,不然2和3会有更小的公倍数6. 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm>

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

【Java】 剑指offer(10) 旋转数组的最小数字

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1. 思路 数组在一定程度上是排序的,很容易分析出:可以采用二分法来寻找最小数字. 但是这里面有一些陷阱: 1.递增排序数组的本身是自己的旋转,则最小数字

[cogs461] [网络流24题#10] 餐巾 [网络流,最小费用最大流]

建图:从源点向第一层连边,第一层表示当天用掉多少餐巾,第二层表示当天需要多少餐巾,所以注意购买餐巾的边容量为无穷大,要从源点开始连向第二层的点,每天可能有剩余,在第一层内表示为流入第二天的节点.具体见代码,第一次写费用流,不知道模板对不对... #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #includ

Effective Item 10 - 尽量使可变性最小化

不可变类,即实例不能被修改的类,实例中包含的所有信息在对象的生命周期内固定不变. 常见的比如String.基本类型的封装类.BigDecimal.BigInteger. 相对与可变类,不可变更易于设计.实现.使用,且更稳定(less prone to error)更安全. 比如,不可变类本质上就是线程安全的,不需要做同步处理,使用起来也非常方便. 设计不可变类,我们有5个原则: 1.不提供任何可修改对象状态的方法.(这种方法也成为mutator,相对词汇"可变性(mutability)"

[剑指offer] 10. 旋转数组的最小数字

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 利用dp[i]保存盖2*i的矩形有多少种办法. 通过摆前几个推算出规律 1 时候就是 | 2 时候就是 | | 和 -- 摆n的时候就是两种情况,一种是先摆1格,则有dp[n-1]种方法 另一种是先2格,则有dp[n-2]种方法. 于是推出dp[n]=d[n-1]+dp[n-2] class Solution { public: int rectCo

第10章例题(紫书)

21/21 题目都很基础,有很多题书上讲得比较详细,然后隔得时间有点久,所以具体什么trick都忘了,思路也懒得去回忆,所以将就着放上来了.... 例题10–1 Uva 11582 题意:输入a, b, n让你计算F[a^b]%n;其中这个F[i]是斐波那契数: 题解: 这题是快速幂+找循环节,用什么方法找循环节呢?因为第一个数是0和1,然后当再出现0和1的时候就是出现循环节的时候,然后假如找到了循环节T,然后就有F[n] = F[n % T],预处理找循环节,O(一百万左右),快速幂logn

10道ACM例题让你三天学会STL

清明节给大一的孩子们讲了点STL的应用,下了些功夫,搬到这里来供大家学习交流. 1.泛型程序设计简介与迭代器的介绍 2.常见的STL容器及其例题应用(UVA10474,UVA101,UVA10815,UVA156,UVA540,UVA136 HDU1027,CF501B,HDU1716,HDU4277) 3.相关练习和思路 1.泛型程序设计简介与迭代器的介绍 1.1 泛型程序设计简介 泛型程序设计,简单地说就是使用模板的程序设计法.将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,