Codeforces Round 984 Div. 3 题解
Codeforces Round 984 (Div. 3)
Rated: \(756\)
场切:AB(懒得做了)
赛后:CDEF
不会:G
-
A. Quintomania
简单模拟。
-
B. Startup
找到价值前 \(n\) 大的物品总和,相加。
-
C. Anya and 1100
字符串模拟。可以用
find()
函数 -
D. I Love 1543
字符串模拟。
-
E. Reverse the Rivers
二分即可。
-
F. XORificator 3000
前置知识:
设 \(f_i \\\) 表示 $1 \sim n $ 的前缀异或和\[ f_n=\left\{\begin{array}{ll} n & n \bmod 4=0 \\ 1 & n \bmod 4=1 \\ n+1 & n \bmod 4=2 \\ 0 & n \bmod 4=3 \end{array}\right. \]所以可以快速求出 \(l \sim r\) 的异或和为 \(f_r \\ \oplus f_{l-1}\)。
观察对 \(2^{i}\) 同余的数的二进制位。例如 \(x \equiv 2^{4}(\bmod 3)\) 。
\(000011_{2}, 010011_{2}, 100011_{2}, 110011_{2}, \ldots\)
可以发现后 \(i\) 位对异或和没有有影响,只有前几位有影响,因此区间不有趣整数的前缀异或和 \(g(n, i, k)\) 计算方式如下:\[ g(n, i, k)=\mathrm{f}(m) \times 2^{i} \oplus k\left[\mathrm{cnt}_{x} \bmod 2=1\right] \]其中 \(m=\left\lfloor\frac{n-k}{2^{i}}\right\rfloor, \mathrm{cnt}_{x}=m+1 。\)$ \mathrm{cnt}_{x}$ 即为区间不有趣整数的数量。
点击查看代码
#include <bits/stdc++.h> using namespace std; #define int unsigned long long int f(int n){ if (n % 4 == 0) return n; if (n % 4 == 1) return 1; if (n % 4 == 2) return n + 1; return 0; } int g(int n, int i, int k){ if (i == 0){ if (k == 0) return f(n); else return 0; } int pow2 = 1ull << i; if (n < k) return 0; int m = (n - k) / pow2; int cnt = m + 1,res = f(m) << i; if (cnt % 2 == 1) res ^= k; return res; } void solve(){ int l, r, k, i; cin >> l >> r >> i >> k; int sum = f(r) ^ f(l - 1),Xor = g(r, i, k) ^ g(l - 1, i, k); int ans = sum ^ Xor; cout << ans << endl; } signed main(){ int T; cin >> T; while(T--) solve(); return 0; }
-
G. Library of Magic