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;
}

浙公网安备 33010602011771号