专栏文章
题解:P9223 「PEOI Rd1」异或(xor)
P9223题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqz7vl3
- 此快照首次捕获于
- 2025/12/04 13:09 3 个月前
- 此快照最后确认于
- 2025/12/04 13:09 3 个月前
思路
Step 1:暴力
没啥说的
时间复杂度
期望得分:10pts
Step 2:观察分析
首先显然的是最后的结果只与 和 内每一个二进制位上出现 的次数有关
记 内二进制第 位为 的次数为 , 内二进制第 位为 的次数为
对第 位分析,则在累加过程中有 次原式中 在第 位没有发生反转,贡献了 个 ;有 次在第 位发生了反转,贡献了 个 。
则第 位在结果中带来的 的数量(忽略进位)为
则最终答案为
计算上式的时间复杂度为 次,是可接受的,因此我们考虑如何快速得出 和
显然的,若第 位不是 最高位,则
若第 位是 最高位,则 ,原因在于从 开始计起则则 的第 位为 , 的第 位为
对 同理,因此可以在 内得出 的值
综上总时间复杂度为 ,可以通过本题
AC Code
温馨提示:记得及时取模
CPP#include <iostream>
#define ll long long
using namespace std;
const int mod = 998244353;
ll pow2[60] = {1};
signed main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
for (int i = 1; i < 60; i++)
pow2[i] = (pow2[i - 1] << 1);
while (t--)
{
ll n, m, ans = 0;
cin >> n >> m;
for (int j = 0, cnt1, cnt2; pow2[j] <= max(m, n); j++)
{
cnt1 = (m + 1) / pow2[j + 1] % mod * pow2[j] % mod + max(0ll, (m + 1) % pow2[j + 1] - pow2[j]) % mod;
cnt1 %= mod;
cnt2 = (n + 1) / pow2[j + 1] % mod * pow2[j] % mod + max(0ll, (n + 1) % pow2[j + 1] - pow2[j]) % mod;
cnt2 %= mod;
ans += (m - cnt1) % mod * (pow2[j] % mod) % mod * cnt2 % mod;
ans %= mod;
ans += (n - cnt2) % mod * (pow2[j] % mod) % mod * cnt1 % mod;
ans %= mod;
}
cout << ans << '\n';
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...