結果
| 問題 |
No.546 オンリー・ワン
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-12-28 11:59:06 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 1,195 bytes |
| コンパイル時間 | 719 ms |
| コンパイル使用メモリ | 63,464 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-21 08:56:31 |
| 合計ジャッジ時間 | 1,346 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 7 |
ソースコード
#include <iostream>
#include <algorithm>
#include <vector>
int64_t gcd(int64_t x, int64_t y) {
if (y == 0) return x;
return gcd(y, x % y);
}
int64_t lcm(int64_t x, int64_t y) {
return std::min<long long>(1000000001LL, x / gcd(x, y) * y);
}
int64_t f(int64_t x, std::vector<int64_t> c) {
const int n = c.size();
std::vector<int64_t> cnt(1 << n);
for (int i = 0; i < 1 << n; i++) {
int64_t l = 1;
for (int j = 0; j < n; j++) {
if (i >> j & 1) {
l = lcm(l, c[j]);
}
}
cnt[i] = x / l;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < 1 << n; j++) {
if (~j >> i & 1) {
cnt[j | 1 << i] -= cnt[j];
}
}
}
int64_t ret = 0;
for (int i = 0; i < n; i++) {
int u = ((1 << n) - 1) ^ (1 << i);
int v = ((1 << n) - 1);
ret += std::abs(cnt[u]) - std::abs(cnt[v]);
}
return ret;
}
int main() {
int64_t N, L, H;
std::cin >> N >> L >> H;
std::vector<int64_t> c(N);
for (int i = 0; i < N; i++) {
std::cin >> c[i];
}
std::cout << f(H, c) - f(L - 1, c) << std::endl;
}