結果
| 問題 |
No.941 商とあまり
|
| コンテスト | |
| ユーザー |
QCFium
|
| 提出日時 | 2019-09-05 22:07:11 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 1,528 bytes |
| コンパイル時間 | 1,854 ms |
| コンパイル使用メモリ | 180,992 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-11-21 04:34:59 |
| 合計ジャッジ時間 | 16,689 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 6 |
| other | WA * 3 RE * 101 |
ソースコード
#include <bits/stdc++.h>
bool solve(int n, int x, const std::vector<int> &a) {
if (n == 1) return x == a[0];
int64_t prod = 1;
bool cnt1 = false;
for (int i = 0; i < n; i++) {
prod *= a[i] + 1;
if (prod > x + 1) return false;
if (a[i] == 1) cnt1 = true;
}
if (cnt1) return true;
std::set<std::vector<int> > que;
que.insert(a);
while (que.size()) {
if (que.begin()->size() == 1) return std::find(que.begin(), que.end(), std::vector<int>{x}) != que.end();
std::set<std::vector<int> > next;
for (auto &i : que) {
int prod = 1;
for (auto j : i) prod *= j + 1;
for (int j = 0; j < (int) i.size(); j++) {
if (j && i[j] == i[j - 1]) continue;
for (int k = 0; k < (int) i.size(); k++) {
if (j == k) continue;
int cur = prod / (i[j] + 1) / (i[k] + 1);
for (int l = i[k] + 1; ; l++) {
if ((l * i[j] + i[k] + 1) * cur > x + 1) break;
std::vector<int> tmp = i;
tmp[j] = l * i[j] + i[k];
tmp.erase(tmp.begin() + k);
std::sort(tmp.begin(), tmp.end());
next.insert(tmp);
}
}
}
}
que.swap(next);
}
return false;
}
int main() {
int n, x;
scanf("%d%d", &n, &x);
assert(1 <= n && n <= 100000);
assert(1 <= x && x <= 5000);
std::vector<int> a(n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]), assert(1 <= a[i] && a[i] <= 5000);
clock_t r0 = clock();
std::cout << (solve(n, x, a) ? "YES" : "NO") << std::endl;
clock_t r1 = clock();
std::cerr << (double) (r1 - r0) * 1000 / CLOCKS_PER_SEC << "ms" << std::endl;
return 0;
}
QCFium