比赛 |
2025.3.18 |
评测结果 |
AAAAAAAAAA |
题目名称 |
公约数数列 |
最终得分 |
100 |
用户昵称 |
健康铀 |
运行时间 |
1.958 s |
代码语言 |
C++ |
内存使用 |
7.78 MiB |
提交时间 |
2025-03-18 21:28:38 |
显示代码纯文本
- #include <bits/stdc++.h>
- using namespace std;
-
- struct Block {
- int l, r;
- vector<int> a;
- vector<int> g;
- vector<long long> x;
- int bg;
- long long bx;
- unordered_map<long long, int> xm;
-
- void init() {
- int m = a.size();
- g.resize(m);
- x.resize(m);
- if (m == 0) return;
- g[0] = a[0];
- x[0] = a[0];
- for (int i = 1; i < m; ++i) {
- g[i] = __gcd(g[i-1], a[i]);
- x[i] = x[i-1] ^ a[i];
- }
- bg = g.back();
- bx = x.back();
- xm.clear();
- for (int i = 0; i < m; ++i) {
- long long v = x[i];
- if (!xm.count(v)) {
- xm[v] = i;
- }
- }
- }
- };
-
- vector<Block> blks;
- int n;
- vector<int> arr;
-
- void build(int sz) {
- blks.clear();
- for (int i = 0; i < n; ) {
- Block b;
- b.l = i;
- b.r = min(i + sz - 1, n - 1);
- for (int j = b.l; j <= b.r; ++j) {
- b.a.push_back(arr[j]);
- }
- b.init();
- blks.push_back(b);
- i = b.r + 1;
- }
- }
-
- void upd(int id, int val) {
- arr[id] = val;
- for (auto &b : blks) {
- if (b.l <= id && id <= b.r) {
- int pos = id - b.l;
- b.a[pos] = val;
- b.init();
- break;
- }
- }
- }
-
- int qry(long long val) {
- int cg = 0;
- long long cx = 0;
- for (const auto &b : blks) {
- if (b.a.empty()) continue;
- if (cg == 0) {
- int ng = 0;
- long long nx = 0;
- for (int i = 0; i < b.a.size(); ++i) {
- int num = b.a[i];
- ng = __gcd(ng, num);
- nx ^= num;
- if (static_cast<long long>(ng) * nx == val) {
- return b.l + i;
- }
- }
- cg = ng;
- cx = nx;
- } else {
- int g = __gcd(cg, b.bg);
- if (g == cg) {
- if (val % cg != 0) {
- cx ^= b.bx;
- continue;
- }
- long long t = val / cg;
- long long rx = cx ^ t;
- auto it = b.xm.find(rx);
- if (it != b.xm.end()) {
- return b.l + it->second;
- } else {
- cx ^= b.bx;
- }
- } else {
- int tg = cg;
- long long tx = cx;
- for (int i = 0; i < b.a.size(); ++i) {
- int num = b.a[i];
- tg = __gcd(tg, num);
- tx ^= num;
- if (static_cast<long long>(tg) * tx == val) {
- return b.l + i;
- }
- }
- cg = tg;
- cx = tx;
- }
- }
- }
- return -1;
- }
-
- int main() {
- freopen("gcdxor.in", "r", stdin);
- freopen("gcdxor.out", "w", stdout);
- ios::sync_with_stdio(false);
- cin.tie(0);
- cin >> n;
- arr.resize(n);
- for (int i = 0; i < n; ++i) {
- cin >> arr[i];
- }
- int sz = sqrt(n);
- build(sz);
- int q;
- cin >> q;
- while (q--) {
- string op;
- cin >> op;
- if (op == "MODIFY") {
- int id, val;
- cin >> id >> val;
- upd(id, val);
- } else {
- long long val;
- cin >> val;
- int res = qry(val);
- if (res == -1) {
- cout << "no\n";
- } else {
- cout << res << '\n';
- }
- }
- }
- return 0;
- }