2025“钉耙编程”中国大学生算法设计春季联赛(4)1003 洞察

news/2025/3/31 20:34:23/文章来源:https://www.cnblogs.com/archer233/p/18799079

题目大意

给定正整数 $ k, b, c, v $,求满足以下条件的非负整数 $ x $ 的数量:

\[x \oplus c \leq v \]

其中 $ \oplus $ 表示异或运算。输入包含多组测试数据,每组数据的参数范围极大($ 10^{18} $ 级别)。


解题思路

核心思想:二进制位逐位分析

由于异或运算的性质,直接比较二进制位的大小关系。从最高位到最低位逐位确定 $ x $ 的取值范围,通过位运算将问题分解为多个独立的子问题。


关键步骤

1. 预处理函数

定义函数 get(l, r) 计算满足区间 $ [l, r] $ 内合法 $ x $ 的数量。其数学表达式为:

\[\text{get}(l, r) = \sum_{x=l}^{r} \mathbb{I}[x \bmod k = b] \]

此函数用于快速统计区间内的合法 $ x $ 数量。


2. 逐位枚举

从最高位(62位)到最低位(0位)逐位处理:

  • 对于当前位 $ i $:
    • 若 $ v $ 的第 $ i $ 位为 $ 1 $:
      • 当前位异或结果为 $ 0 $:此时 $ x $ 的取值范围受限于该位的约束。
      • 当前位异或结果为 $ 1 $:此时该位的贡献可直接计入答案,后续位无需考虑。
    • 若 $ v $ 的第 $ i $ 位为 $ 0 $:
      • 当前位异或结果必须为 $ 0 $,否则直接返回无解。

3. 动态维护区间

使用变量 $ \text{now} $ 记录当前已确定的高位部分的异或结果。通过调整 $ \text{now} $ 的值,逐步缩小 $ x $ 的可能范围,并累加符合条件的 $ x $ 数量。


4. 特殊边界处理

最终需检查是否存在 $ x $ 使得 $ x \oplus c = v $,若存在则补全计数。


代码实现

以下是完整的代码实现:

#include<bits/stdc++.h>
#define int long long
using namespace std;const int N = 1e5 + 10;void solve() {int k, b, c, v;cin >> k >> b >> c >> v;// 定义函数 p(x),计算满足 (x - b) % k == 0 的最大 x 值auto p = [&](int x) {if (x < b) return 0ll;else if (x == b) return 1ll;else return (x - b) / k + 1ll;};int mx = 0;// 定义函数 get(l, r),计算区间 [l, r] 内合法 x 的数量auto get = [&](int l, int r) {mx = max(mx, p(r));return (p(r) - p(l - 1));};int now = 0, cnt = 0;// 逐位处理,从最高位到最低位for (int i = 62; i >= 0; i--) {if (v >> i & 1) { // 如果 v 的第 i 位为 1if (c >> i & 1) { // 如果 c 的第 i 位为 1now += (1ll << i); // 尝试设置当前位为 1cnt += get(now, now + (1ll << i) - 1); // 统计当前分支的贡献now -= (1ll << i); // 恢复状态} else { // 如果 c 的第 i 位为 0cnt += get(now, now + ((1ll << i) - 1)); // 直接统计当前分支的贡献now += (1ll << i); // 设置当前位为 1}} else if (c >> i & 1) { // 如果 v 的第 i 位为 0 且 c 的第 i 位为 1now += (1ll << i); // 必须设置当前位为 1}}// 最后检查是否存在恰好等于的情况now -= b;if (now >= 0 && now % k == 0) cnt++;cout << cnt << '\n';
}signed main() {ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);int T;cin >> T;while (T--) solve();return 0;
}

代码解析

1. 函数 p(x)

计算满足 $ x \bmod k = b $ 的最大 $ x $ 值:

\[p(x) = \begin{cases} 0 & \text{if } x < b \\ 1 & \text{if } x = b \\ \lfloor \frac{x - b}{k} \rfloor + 1 & \text{otherwise} \end{cases} \]


2. 函数 get(l, r)

利用 $ p(x) $ 快速统计区间 $ [l, r] $ 内的合法 $ x $ 数量:

\[\text{get}(l, r) = p(r) - p(l - 1) \]


3. 逐位处理

通过位运算判断当前位的可能取值,动态调整 $ \text{now} $ 并累加答案。


4. 边界处理

最后检查是否存在恰好等于 $ x \oplus c = v $ 的情况,避免遗漏。


时间复杂度

算法的时间复杂度为:

\[O(T \cdot \log v) \]

其中 $ T $ 是测试数据组数,$ \log v $ 是逐位处理的最大迭代次数。对于 $ v \leq 10^{18} $,该算法可以轻松通过所有测试数据。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907425.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷 P1216 [IOI 1994] 数字三角形 Number Triangles (记忆化搜索)

记忆化搜索思路:经典的DP题,看题解大佬个个是状态转移方程...我就写个记忆化搜索吧,这个数据量,只dfs暴搜是过不去的,写完记忆化之后发现有个测试点T了,下载了一波测试点数据,发现全是0,那么初始化dp数组为-1就好了。AcCode: #include<bits/stdc++.h> using nam…

【软件】在Windows和Ubuntu上使用TFTP和NFS

在Windows和Ubuntu上使用TFTP和NFS 零、介绍 最近在玩Linux开发板,在开发的过程中发现需要用到tftp和nfs来帮助传输文件,故此记录如何使用这两种软件。 TFTP(Trivial File Transfer Protocol) :是一种简化的文件传输协议,设计用于在客户端和服务器之间快速传输文件。轻量…

FastAPI Pydantic动态调整Schema

title: FastAPI Pydantic动态调整Schema date: 2025/3/29 updated: 2025/3/29 author: cmdragon excerpt: Pydantic动态Schema支持运行时字段调整和环境变量控制,实现毫秒级配置生效。通过字段级动态注入和条件必填验证,灵活适应业务需求。多租户系统采用条件字段过滤实现数…

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)

比赛链接 本文发布于博客园,会跟随补题进度实时更新,若您在其他平台阅读到此文,请前往博客园获取更好的阅读体验。 跳转链接:https://www.cnblogs.com/TianTianChaoFangDe/p/18799072 开题 + 补题情况 和前三场比起来前期的签到题发挥稳定了许多,没有被卡很久,不过 1001 …

详细介绍Mybatis的缓存机制

一、缓存机制 1、缓存概述 缓存:缓存就是一块内存空间,保存临时数据 作用:将数据源(数据库或者文件)中的数据读取出来存放到缓存中,再次获取时直接从缓存中获取,可以减少和数据库交互的次数,提升程序的性能 缓存适用: 适用于缓存的:经常查询但不经常修改的,数据的正…

JS梳理之es6异步async await 协程 迭代器

es6异步 promise 链式调用 是对回调炼狱的一种优化 这次梳理一下async await async function fetchData() {const response = await fetch(https://api.example.com/data);const data = await response.json();return data; }// async 声明这是一个异步函数 // await 会暂停函数…

百度云同步盘 登录失败【%d】【155010】

前言全局说明百度云同步盘在2016前后升级了一次,修改了接口,但是没有发布完整安装包,当时可以自动升级来解决,后来自动升级失效,就之能手动打补丁来解决了。详细解决过程:https://www.cnblogs.com/wutou/p/18799043一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.3737二…

grpc实现Aop

创建项目服务端:微软官方自带的ASP.NET.Core.gRPC服务项目。 客户端:ASP.NET.Core.WebApi项目。 公共类库:主要为AOP自定义拦截器类。依赖包导入 客户端:Grpc.AspNetCore、Grpc.Core.Api、Grpc.Net.ClientFactory、Grpc.Tools。公共类库:Grpc.Core.Api公共类库项目配置 创…

Win 11 安装百度云同步盘

前言全局说明百度网盘最早出来叫“百度云管家”,可以上传下载东西,后来大概在2012年,百度云同步盘上线,后来将云管家和同步盘放到一起,叫百度云,也就是现在用的这个。下面介绍 如何在 Win11上用百度云同步盘一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.3737二、下载…

C语言打卡学习第7天(2025.3.26)(补发)

![](https://img2024.cnblogs.com/blog/3622651/202503/3622651- 20250329002951976-79699626.jpg)1.换个网站把题简单做了几道 2,把积存的问题好好问了一下,明天“亡羊补牢”:冒泡排序、数组指针简单用法、之前网站的简单题 明天贪一点,起码把原来网站那些题啃了

VGG

VGG 网络LRN(Local Response Normalization)来自于AlexNet现在已经不怎么使用,因为经过很多实验并没有较大的作用 conv的stride为1,padding为1 maxpool的size为2,stride为2感受野叠加 论文中一个比较重要的使用就是感受野的叠加 感受野(Receptive Field)是卷积神经网络中一…

日语声调

日语声调的记忆 方法1方法2方法3日语声调的标记方法 方法1:划线规律1:第1个音 和 第2个音不是同音 规律2:出现降音就不会升回去 规律3:“高-低”在第几个音出现,就是几型 方法2:数字