U362811 GSEP 5级样题 小杨的锻炼

GSEP 5级样题 小杨的锻炼

题目描述

小杨的班级里共有 N 名同学,每位同学都有各自的锻炼习惯。具体来说,第i位同学每隔 a_i 天就会进行一次锻炼(也就是说,每次锻炼会在上一次锻炼的a_i 天后进行)。

某一天,班上的 N 名同学恰好都来进行了锻炼。他们对此兴奋不已,想要计算出下一次所有同学都来锻炼,至少要过多少天。但他们不会计算,你能帮帮他们吗?

输入格式

第一行一个整数 N,表示同学的数量。

第二行 N 个用空格隔开的正整数,依次为 a_0, a_1, …, a_n-1。

输出格式

输出一个整数,表示下一次所有同学都来锻炼,至少要过多少天。

样例 #1

样例输入 #1

3
1 2 3

样例输出 #1

6

样例 #2

样例输入 #2

4
2 4 8 16

样例输出 #2

16

样例 #3

样例输入 #3

4
2 4 6 8

样例输出 #3

24

提示

样例解释1:

第一位同学每天都锻炼;第二位同学每 2 天锻炼一次;第三位同学每 3 天锻炼一次。因此,6 天之后,三位同学都会进行锻炼。在此之前,第二位同学只会在第 2, 4 天进行锻炼,第三位同学只会在第 3 天进行锻炼,他们都无法相遇。

样例解释2:

第四位同学每 16 天锻炼一次,而第 16 天后也恰好是前三位同学锻炼的日子。

对于 20% 的测试点,保证 N = 2。

对于 50% 的测试点,保证 N ≤ 4。

对于所有测试点,保证 2 ≤N ≤ 10, 1≤a_i≤ 50。


#include <iostream>

using namespace std;

uint64_t gcd(uint64_t a, uint64_t b) {
	if (a > b) swap(a, b);
	while (a % b) {
		uint64_t t = a % b;
		a = b;
		b = t;
	}
	return b;
}


// 此题要点找到最小公倍数
int main() {
	int N; cin >> N;
	uint64_t lcm; cin >> lcm;
	for (int i = 1; i < N; i++) {
		uint64_t t; cin >> t;
		uint64_t g = gcd(lcm, t); // 找到两数的最大公约数
		lcm = lcm * t / g; // 找到两数的最小公倍数
	}
	cout << lcm;
}
posted @ 2023-10-01 00:43  iamy  阅读(632)  评论(0)    收藏  举报