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

posted @ 2024-11-03 13:19  Star_F  阅读(123)  评论(0)    收藏  举报