公式

B - 全員参加できる会議室 / Meeting Room Where Everyone Can Attend 解説 by MtSaka


全員が参加できる会議室の番号は \(P_1,P_2,\ldots,P_N\) の公倍数です。このうち最小のものが \(M\) 以下であれば、全員が参加できる会議室が存在します。

実際には \(\operatorname{lcm}(P_1,P_2,\ldots,P_N)\) を求めると、非常に大きい値になることがあります。それにより、この値を直接計算しようとするとオーバーフローや多倍長整数を用いても実行時間制限に間に合わないことがあります。

そのため、 \(\operatorname{lcm}(P_1,P_2,\ldots,P_i)\) を順に求めていって、\(M\) より大きい値になった時点で No と出力して終了するようにするとよいです。

また、\(\operatorname{lcm}(P_1,P_2,\ldots,P_i)\)\(P_{i+1}\) から \(\operatorname{lcm}(P_1,P_2,\ldots,P_i,P_{i+1})\) を求めるときにも、64bit整数型ではオーバーフローすることがあります。 \(\operatorname{lcm}(a,b)=\frac{a \times b}{\gcd(a,b)}\) であるこを用いて、オーバーフローを回避することができます。詳細は実装例を参照してください。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    long long m;
    cin >> n >> m;
    long long l = 1;
    for (int i = 0; i < n; ++i) {
        long long p;
        cin >> p;
        long long g = gcd(p, l);
        l /= g;
        if (m / p < l) {
            cout << "No" << endl;
            return 0;
        }
        l *= p;
    }
    if (l <= m) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
}

実装例(Python)

import math

n, m = map(int, input().split())
p = list(map(int, input().split()))
l = 1

for e in p:
    l = math.lcm(l, e)
    if l > m:
        print("No")
        exit()

if l <= m:
    print("Yes")
else:
    print("No")

投稿日時:
最終更新: