QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#606025 | #9426. Relearn through Review | shift | WA | 148ms | 3840kb | C++20 | 2.9kb | 2024-10-02 21:41:29 | 2024-10-02 21:41:30 |
Judging History
answer
#include <bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
template<typename T>
struct RMQ {
int n;
std::vector<int> BIT;
std::vector<std::vector<T>> st;
RMQ() {}
RMQ(const std::vector<T> &v) {
init(v);
}
void initBIT(int n) {
BIT.resize(n + 1);
for(int i = 2; i <= n; i ++ ) {
BIT[i] = BIT[i / 2] + 1;
}
}
void init(const std::vector<T> &v) {
n = v.size();
initBIT(n);
const int K = BIT[n];
st.assign(n, std::vector<T>(K + 1));
for(int i = 0; i < n; i ++ ) {
st[i][0] = v[i];
}
for(int x = 1; x <= K; x ++ ) {
for(int i = 0; i + (1 << x) - 1 < n; i ++ ) {
st[i][x] = std::gcd(st[i][x - 1], st[i + (1 << (x - 1))][x - 1]);
}
}
}
T query(int l, int r) {
int B = BIT[r - l + 1];
return std::gcd(st[l][B], st[r - (1 << B) + 1][B]);
}
};
void solve() {
i64 n, k;
std::cin >> n >> k;
std::vector<i64> g(n + 2), rg(n + 2), a(n + 2);
for(int i = 1; i <= n; i ++ ) {
std::cin >> a[i];
g[i] = std::gcd(g[i - 1], a[i]);
}
for(int i = n; i >= 1; i -- ) {
rg[i] = std::gcd(rg[i + 1], a[i]);
}
for(int i = 1; i <= n; i ++ ) {
a[i] += k;
}
RMQ<i64> rmq(a);
auto fidr = [&](int p, i64 v) -> int {
if(a[p] % v) return -1;
int l = p, r = n;
while(l < r) {
int mid = l + r + 1 >> 1;
if((rmq.query(p, mid) % v) == 0) l = mid;
else r = mid - 1;
}
return l;
};
auto fidl = [&](int p, i64 v) -> int {
if(a[p]% v) return -1;
int l = 1, r = p;
while(l < r) {
int mid = l + r >> 1;
if(rmq.query(mid, p) % v == 0) r = mid;
else l = mid + 1;
}
return r;
};
i64 ans = g[n];
for(int i = 1; i <= n; i ++ ) {
if(i == n) continue;
int p = fidr(i + 1, g[i]);
if(p != -1) {
if(p == n) {
ans = std::max(ans, g[i]);
} else if((rg[p + 1] % g[i]) == 0) {
ans = std::max(ans, rg[i]);
}
}
}
for(int i = n; i >= 1; i -- ) {
if(i == 1) continue;
int p = fidl(i - 1, rg[i]);
if(p != -1) {
if(p == 1) {
ans = std::max(ans, rg[i]);
} else if(g[p - 1] % rg[i] == 0) {
ans = std::max(ans, rg[i]);
}
}
}
ans = std::max(ans, rmq.query(1, n));
std::cout << ans << '\n';
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t = 1;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3608kb
input:
2 6 2 5 3 13 8 10 555 3 0 3 6 9
output:
5 3
result:
ok 2 lines
Test #2:
score: -100
Wrong Answer
time: 148ms
memory: 3840kb
input:
100000 1 608611451460421713 33155506392034032 1 743116173559300609 6138108577573005 7 364454564010802125 657035115675878115 657035115675878115 657035115675878115 657035115675878115 657035115675878115 292580551665075990 657035115675878115 4 316648374341335221 365788422120542814 182894211060271407 731...
output:
641766957852455745 749254282136873614 657035115675878115 182894211060271407 880411769063535667 560553564512176618 1 962990836390050009 616597869896951268 878097339332572161 188820994675344528 997057718507559252 949074379610491450 1 632093288650732211 1 356502546608886970 789177332497135009 566104642...
result:
wrong answer 7th lines differ - expected: '183698346865682381', found: '1'