結果
| 問題 |
No.2592 おでぶなおばけさん 2
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-12-10 12:22:17 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,687 bytes |
| コンパイル時間 | 2,357 ms |
| コンパイル使用メモリ | 205,820 KB |
| 最終ジャッジ日時 | 2025-02-18 09:59:47 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 77 WA * 6 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/segtree.hpp>
using namespace std;
using ll = long long;
// 有名MODたちでチェックする、WAを期待する解法
const ll MOD1 = 1000000007;
const ll MOD2 = 998244353;
const ll MOD3 = (1LL << 61) - 1;
static_assert(MOD1 < numeric_limits<ll>::max() / 2);
static_assert(MOD2 < numeric_limits<ll>::max() / 2);
static_assert(MOD3 < numeric_limits<ll>::max() / 2);
using S = tuple<ll, ll, ll>;
S op(const S a, const S b) {
auto [a1, a2, a3] = a;
auto [b1, b2, b3] = b;
return {(a1 + b1) % MOD1, (a2 + b2) % MOD2, (a3 + b3) % MOD3};
}
S e() {
return {0, 0, 0};
}
using segtree = atcoder::segtree<S, op, e>;
int main() {
ll n, q, k;
cin >> n >> q >> k;
vector<S> a;
for (int i = 0; i < n; i++) {
ll x;
cin >> x;
a.push_back({
(x % MOD1 + MOD1) % MOD1,
(x % MOD2 + MOD2) % MOD2,
(x % MOD3 + MOD3) % MOD3,
});
}
// b[i] := (a[i] * pow(k, i)) % MOD
vector<S> b(n);
__uint128_t powk1 = 1, powk2 = 1, powk3 = 1;
for (int i = 0; i < n; i++) {
// a[i], powk ともに MOD < 2^63 以下なので、128ビットで十分
auto [ai1, ai2, ai3] = a[i];
b[i] = {
(ai1 * powk1) % MOD1,
(ai2 * powk2) % MOD2,
(ai3 * powk3) % MOD3,
};
powk1 = (powk1 * k) % MOD1;
powk2 = (powk2 * k) % MOD2;
powk3 = (powk3 * k) % MOD3;
}
segtree st(b);
for (int i = 0; i < q; i++) {
int l, r;
cin >> l >> r;
l--;
r--;
cout << (st.prod(l, r + 1) != make_tuple(0, 0, 0) ? "Yes" : "No") << endl;
}
}