比赛 2025.3.18 评测结果 AAAAAAAAAA
题目名称 公约数数列 最终得分 100
用户昵称 健康铀 运行时间 1.958 s
代码语言 C++ 内存使用 7.78 MiB
提交时间 2025-03-18 21:28:38
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct Block {
  5. int l, r;
  6. vector<int> a;
  7. vector<int> g;
  8. vector<long long> x;
  9. int bg;
  10. long long bx;
  11. unordered_map<long long, int> xm;
  12.  
  13. void init() {
  14. int m = a.size();
  15. g.resize(m);
  16. x.resize(m);
  17. if (m == 0) return;
  18. g[0] = a[0];
  19. x[0] = a[0];
  20. for (int i = 1; i < m; ++i) {
  21. g[i] = __gcd(g[i-1], a[i]);
  22. x[i] = x[i-1] ^ a[i];
  23. }
  24. bg = g.back();
  25. bx = x.back();
  26. xm.clear();
  27. for (int i = 0; i < m; ++i) {
  28. long long v = x[i];
  29. if (!xm.count(v)) {
  30. xm[v] = i;
  31. }
  32. }
  33. }
  34. };
  35.  
  36. vector<Block> blks;
  37. int n;
  38. vector<int> arr;
  39.  
  40. void build(int sz) {
  41. blks.clear();
  42. for (int i = 0; i < n; ) {
  43. Block b;
  44. b.l = i;
  45. b.r = min(i + sz - 1, n - 1);
  46. for (int j = b.l; j <= b.r; ++j) {
  47. b.a.push_back(arr[j]);
  48. }
  49. b.init();
  50. blks.push_back(b);
  51. i = b.r + 1;
  52. }
  53. }
  54.  
  55. void upd(int id, int val) {
  56. arr[id] = val;
  57. for (auto &b : blks) {
  58. if (b.l <= id && id <= b.r) {
  59. int pos = id - b.l;
  60. b.a[pos] = val;
  61. b.init();
  62. break;
  63. }
  64. }
  65. }
  66.  
  67. int qry(long long val) {
  68. int cg = 0;
  69. long long cx = 0;
  70. for (const auto &b : blks) {
  71. if (b.a.empty()) continue;
  72. if (cg == 0) {
  73. int ng = 0;
  74. long long nx = 0;
  75. for (int i = 0; i < b.a.size(); ++i) {
  76. int num = b.a[i];
  77. ng = __gcd(ng, num);
  78. nx ^= num;
  79. if (static_cast<long long>(ng) * nx == val) {
  80. return b.l + i;
  81. }
  82. }
  83. cg = ng;
  84. cx = nx;
  85. } else {
  86. int g = __gcd(cg, b.bg);
  87. if (g == cg) {
  88. if (val % cg != 0) {
  89. cx ^= b.bx;
  90. continue;
  91. }
  92. long long t = val / cg;
  93. long long rx = cx ^ t;
  94. auto it = b.xm.find(rx);
  95. if (it != b.xm.end()) {
  96. return b.l + it->second;
  97. } else {
  98. cx ^= b.bx;
  99. }
  100. } else {
  101. int tg = cg;
  102. long long tx = cx;
  103. for (int i = 0; i < b.a.size(); ++i) {
  104. int num = b.a[i];
  105. tg = __gcd(tg, num);
  106. tx ^= num;
  107. if (static_cast<long long>(tg) * tx == val) {
  108. return b.l + i;
  109. }
  110. }
  111. cg = tg;
  112. cx = tx;
  113. }
  114. }
  115. }
  116. return -1;
  117. }
  118.  
  119. int main() {
  120. freopen("gcdxor.in", "r", stdin);
  121. freopen("gcdxor.out", "w", stdout);
  122. ios::sync_with_stdio(false);
  123. cin.tie(0);
  124. cin >> n;
  125. arr.resize(n);
  126. for (int i = 0; i < n; ++i) {
  127. cin >> arr[i];
  128. }
  129. int sz = sqrt(n);
  130. build(sz);
  131. int q;
  132. cin >> q;
  133. while (q--) {
  134. string op;
  135. cin >> op;
  136. if (op == "MODIFY") {
  137. int id, val;
  138. cin >> id >> val;
  139. upd(id, val);
  140. } else {
  141. long long val;
  142. cin >> val;
  143. int res = qry(val);
  144. if (res == -1) {
  145. cout << "no\n";
  146. } else {
  147. cout << res << '\n';
  148. }
  149. }
  150. }
  151. return 0;
  152. }