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

    前置知识:
    fi 表示 1n 的前缀异或和

    fn={nnmod4=01nmod4=1n+1nmod4=20nmod4=3

    所以可以快速求出 lr 的异或和为 frfl1

    观察对 2i 同余的数的二进制位。例如 x24(mod3)
    0000112,0100112,1000112,1100112,
    可以发现后 i 位对异或和没有有影响,只有前几位有影响,因此区间不有趣整数的前缀异或和 g(n,i,k) 计算方式如下:

    g(n,i,k)=f(m)×2ik[cntxmod2=1]

    其中 m=nk2i,cntx=m+1cntx 即为区间不有趣整数的数量。

    点击查看代码
    #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 @   Star_F  阅读(75)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示