LightOJ 1024 Eid

本文介绍了一种求解多个整数最小公倍数的有效算法,适用于整数范围较大且数量较多的情况。通过质因数分解,记录每个质因数的最大次数,并以此为基础计算最小公倍数。

Description

In a strange planet there are n races. They are completely different as well as their food habits. Each race has a food-eating period. That means the ithrace eats after every xi de-sec (de-sec is the unit they use for counting time and it is used for both singular and plural). And at that particular de-sec they pass the whole day eating.

The planet declared the de-sec as 'Eid' in which all the races eat together.

Now given the eating period for every race you have to find the number of de-sec between two consecutive Eids.

Input

Input starts with an integer T (≤ 225), denoting the number of test cases.

Each case of input will contain an integer n (2 ≤ n ≤ 1000) in a single line. The next line will contain n integers separated by spaces. The ith integer of this line will denote the eating period for the ith race. These integers will be between 1 and 10000.

Output

For each case of input you should print a line containing the case number and the number of de-sec between two consecutive Eids. Check the sample input and output for more details. The result can be big. So, use big integer calculations.

Sample Input

2

3

2 20 10

4

5 6 30 60

Sample Output

Case 1: 20

Case 2: 60


题意:给你n个数,求着n个数的最小公倍数
n<1000 且  1< 每个数 <10000 

直接gcd每个数然后相乘肯定会爆longlong
所以换一下思路
用唯一分解定理求出每个数的质因数及个数,存储每个质因数的最多个数
最后再高精全部乘起来就行了

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
#include <string>
#include <sstream>
#include <map>
#include <set>
#define pi acos(-1.0)
#define LL long long
#define ULL unsigned long long
#define inf 0x3f3f3f3f
#define INF 1e18
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define debug(a) printf("---%d---\n", a)
#define mem0(a) memset(a, 0, sizeof(a))
#define memi(a) memset(a, inf, sizeof(a))
#define mem1(a) memset(a, -1, sizeof(a))
#define input1(a) scanf("%d", &a)
#define input2(a,b) scanf("%d %d", &a, &b)
#define input3(a,b,c) scanf("%d %d %d", &a, &b, &c)
using namespace std;
typedef pair<int, int> P;
const double eps = 1e-10;
const int maxn = 1e6 + 5;
const int N = 1e4 + 5;
const int mod = 1e8;

int prime[maxn], vis[maxn], pt;
int cnt[maxn];
int ans[N], high;
void chart()
{
	memset(vis, 0, sizeof(vis));
	vis[1] = 1;
	pt = 0;
	for (int i = 2; i < N; i++){
		if (vis[i]) continue;
		prime[++pt] = i;
		for (int j = 2; j * i < N; j++)
			vis[j * i] = 1;
	}  
}
void solve(int x)
{
//	int i;
//	for (i = 1; i <= pt && prime[i]*prime[i] <= x; i++){ // 用prime[i]*prime[i] <= x 优化 
//		int tmp = 0;
//		while (x % prime[i] == 0){
//			x /= prime[i];
//			tmp++;
//		}
//		cnt[i] = max(cnt[i], tmp);
//		high = max(high, i);
//	}
//	if (x > 1){
//		for (; i <= pt; i++)
//			if (prime[i] == x) {
//				cnt[i] = max(cnt[i], 1);
//				high = max(high, i);
//				break;
//			}
//	}
	for (int i = 1; i <= pt; i++){ // 唯一分解定理 
		int tmp = 0;
		while (x % prime[i] == 0){
			x /= prime[i];
			tmp++;
		}
		cnt[i] = max(cnt[i], tmp);
		high = max(high, i);
		if (x == 1) break;
	} 
}

int main(void)
{
//	freopen("in.txt","r", stdin);
	chart();
	int T, n, x, cas = 0;
	cin >> T;
	while (T--)
	{
		cin >> n;
		memset(cnt, 0, sizeof(cnt));
		high = -1;
		for (int i = 1; i <= n; i++){
			cin >> x;
			solve(x);
		}
		memset(ans, 0, sizeof(ans));
		ans[0] = 1;
		for (int i = 1; i <= high; i++){
			if (cnt[i] == 0) continue;
			int num = pow(prime[i], cnt[i]);
			for (int j = 0; j < 5002; j++) ans[j] *= num;
			for (int j = 0; j < 5002; j++){
				ans[j+1] += ans[j]/10;  
				ans[j] %= 10;
			}
		}
		int dex = 5001;
		while (ans[dex] == 0) dex--;
		printf("Case %d: ", ++cas);
		for (int i = dex; i >= 1; i--) printf("%d", ans[i]);
		printf("%d\n", ans[0]);
	} 

	return 0;
}



已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 QueueForMcu 基于单片机实现的队列功能模块,主要用于8位、16位、32位非运行RTOS的单片机应用,兼容大多数单片机平台。 开源代码:https://.com/xiaoxinpro/QueueForMcu 一、特性 动态创建队列对象 动态设置队列数据缓冲区 静态指定队列元素数据长度 采用值传递的方式保存队列数据 二、快速使用 三、配置说明 目前QueueForMcu只有一个静态配置项,具体如下: 在文件 中有一个宏定义 用于指定队列元素的数据长度,默认是 ,可以根据需要更改为其他数据类型。 四、数据结构 队列的数据结构为 用于保存队列的状态,源码如下: 其中 为配置项中自定义的数据类型。 五、创建队列 1、创建队列缓存 由于我们采用值传递的方式保存队列数据,因此我们在创建队列前要手动创建一个队列缓存区,用于存放队列数据。 以上代码即创建一个大小为 的队列缓存区。 2、创建队列结构 接下来使用 创建队列结构,用于保存队列的状态: 3、初始化队列 准备好队列缓存和队列结构后调用 函数来创建队列,该函数原型如下: 参数说明: 参考代码: 六、压入队列 1、单数据压入 将数据压入队列尾部使用 函数,该函数原型如下: 参数说明: 返回值说明: 该函数会返回一个 枚举数据类型,返回值会根据队列状态返回以下几个值: 参考代码: 2、多数据压入 若需要将多个数据(数组)压入队列可以使用 函数,原理上循环调用 函数来实现的,函数原型如下: 参数说明: 当数组长度大于队列剩余长度时,数组多余的数据将被忽略。 返回值说明: 该函数将返回实际被压入到队列中的数据长度。 当队列中的剩余长度富余...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值