【每日一题】AcWing 5271. 易变数 | 思维 | 中等

题目内容

原题链接

给定一个二进制表示的数 s s s
定义函数 f ( x ) f(x) f(x) x x x 的二进制位中为 1 1 1 的数量。每次操作可以使得 x → f ( x ) x\rightarrow f(x) xf(x) ,问在最少操作次数下,恰好 k k k 次操作后为 1 1 1 的数有多少,答案对 1 0 9 + 7 10^9+7 109+7 取模

数据范围

  • 1 ≤ s < 2 1000 1\leq s<2^{1000} 1s<21000
  • 0 ≤ k ≤ 1000 0\leq k\leq 1000 0k1000

题解

这个数 s s s 的上限很大,该怎么考虑呢?

考虑 x x x 2 1000 − 1 2^{1000}-1 210001 时,其二进制位为 1000 1000 1000 1 1 1 f ( x ) = 1000 f(x)=1000 f(x)=1000

所以只需要暴力计算下 1000 1000 1000 以内的数到 1 1 1 的最小次数即可。

定义 d p [ x ] dp[x] dp[x] 表示 x x x 通过 f f f 函数到达 1 1 1 的最小次数。

状态转移为: d p [ x ] = d p [ f ( x ) ] + 1 dp[x]=dp[f(x)]+1 dp[x]=dp[f(x)]+1

考虑为 d p [ x ] = k − 1 dp[x]=k-1 dp[x]=k1 x x x ,那么二进制位中 1 1 1 的个数为 x x x 的数,到达 1 1 1 的最小次数恰好为 k k k

所以我们找到所有 d p [ x ] = k − 1 dp[x]=k-1 dp[x]=k1 x x x ,然后找到小于等于 s s s 的,二进制位中 1 1 1 的数量为 x x x 的所有的数。

这里考虑到数据范围,很容易联想到数位 d p dp dp

但是这里由于初始化的问题,容易超时,需要细化数位 d p dp dp 的过程。

n n n s s s 的二进制表示的长度,

即如果我们选择 i i i

  • s [ i ] = 1 s[i]=1 s[i]=1

    • 考虑这里选择的数 y y y y [ i ] = 0 y[i]=0 y[i]=0 ,则 y [ i + 1 , ⋯ s − 1 ] y[i+1,\cdots s-1] y[i+1,s1] 都可以为 1 1 1 ,即有 s − i − 1 s-i-1 si1 个位置中,选择若干个位置为 1 1 1 ,这个若干是由剩余可选位置来决定的。
      我们需要有 x x x 1 1 1 ,而 s [ 0 , i ] s[0,i] s[0,i] 中有 m m m 个为 1 1 1 ,那么我们可以选择的就是 m − x m-x mx 位。即 C ( s − i − 1 , m − x ) C(s-i-1,m-x) C(si1,mx)
    • 考虑这里选择的数 y y y y [ i ] = 1 y[i]=1 y[i]=1 ,则后面只能选择 m − x − 1 m-x-1 mx1 1 1 1 了。但是这样直接考虑会超 s s s 的上限,所以将这个问题继续往后抛。直到最后如果 s s s 的二进制位为 1 1 1 的数量恰好为 x x x ,则答案 + 1 。
  • s [ i ] = 0 s[i]=0 s[i]=0 ,则不考虑,因为没有选择, y [ i ] y[i] y[i] 只能为 0 0 0

上述的整体过程,其实就是数位 d p dp dp 的过程。

时间复杂度: O ( n 2 ) O(n^2) O(n2)

代码

#include <bits/stdc++.h>
using namespace std;const int MOD = 1e9 + 7;
int qp(int a, int b) {int res = 1;while (b > 0) {if (b & 1) res = 1ll * res * a % MOD;a = 1ll * a * a % MOD;b >>= 1;}return res;
}int main()
{string s;int k;cin >> s >> k;int n = int(s.size());if (k == 0) {cout << "1\n";return 0;}if (k == 1) {cout << n - 1 << "\n";return 0;}vector<int> fac(n + 1), ifac(n + 1);fac[0] = 1;for (int i = 1; i <= n; ++i) fac[i] = 1ll * fac[i - 1] * i % MOD;ifac[n] = qp(fac[n], MOD - 2);for (int i = n - 1; i >= 0; --i) ifac[i] = 1ll * ifac[i + 1] * (i + 1) % MOD;auto C = [&](int a, int b) -> int {if (b < 0 || a < b) return 0;return int(1ll * fac[a] * ifac[b] % MOD * ifac[a - b] % MOD);};int ans = 0;vector<int> dp(n + 1);dp[1] = 0;for (int i = 2; i <= n; ++i) {int x = i;int cnt = 0;while (x > 0) {cnt += 1;x -= x & -x;}dp[i] = dp[cnt] + 1;if (dp[i] + 1 == k) {// 选择 <= s 的,二进制位个数为 i 的数// 当前第 j 位为 0 ,还剩 n - j - 1 位,要选择这么些个 1int res = 0;int one = 0;for (int j = 0; j < n; ++j) {if (s[j] == '1') {// 当前第 j 位有两种选择// 第 j 位为 0// 剩余 n - j - 1 位都可以为 1,前面已经占据了 one 个 1,后面再选择 k - one 个即可res = (res + C(n - j - 1, i - one)) % MOD;// 第 j 位为 1,如果 j 不是最后一位,即 j + 1 < n ,那么让 one += 1 ,交由后面的位继续考虑// 如果 j 是最后一位,那么考虑 one + 1 是否等于 k 即可// 对于后面的位来说 one 增加了one += 1;}if (j + 1 == n && one == i) {res = (res + 1) % MOD;}}ans = (ans + res) % MOD;}}cout << ans << "\n";return 0;
}

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

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

相关文章

Spring Security 6.1.x 系列 (1)—— 初识Spring Security

一、 Spring Security 概述 Spring Security是Spring组织提供的一个开源安全框架&#xff0c;基于Spring开发&#xff0c;所以非常适合在Spring Boot中使用。 官方文档地址&#xff1a;https://docs.spring.io/spring-security/reference/index.html GitHub地址&#xff1a;…

智能视频监控,究竟“智”在哪里?

当人们一提到智能视频监控时&#xff0c;就会想起高清摄像头、人脸识别等技术。其实不然&#xff0c;真正智能视频监控不仅仅是这些技术算法&#xff0c;更重要的是如何将这些算法融入到应用场景中&#xff0c;更好地去服务大众、起到降本增效的作用。 首先&#xff0c;智能视…

数据结构和算法(10):B-树

B-树&#xff1a;大数据 现代电子计算机发展速度空前&#xff0c;就存储能力而言&#xff0c;情况似乎也是如此&#xff1a;如今容量以TB计的硬盘也不过数百元&#xff0c;内存的常规容量也已达到GB量级。 然而从实际应用的需求来看&#xff0c;问题规模的膨胀却远远快于存储能…

Transformer为什么如此有效 | 通用建模能力,并行

目录 1 更强更通用的建模能力 2 并行计算 3 大规模训练数据 4 多训练技巧的集成 Transformer是一种基于自注意力机制的网络&#xff0c;在最近一两年年可谓是大放异彩&#xff0c;我23年入坑CV的时候&#xff0c;我看到的CV工作似乎还没有一个不用到Transformer里的一些组…

解决 Git:This is not a valid source path/URL

由于sourcetree 可以获取不同仓库的代码&#xff0c;而我的用户名密码比较杂乱&#xff0c;导致经常会修改密码&#xff0c;在新建拉去仓库代码的时候sourcetree 不会提示你密码错误&#xff0c;直接提示 This is not a valid source path/URL。 在已存在的代码仓库&#xff0…

TDengine+OpenVINO+AIxBoard,助力时序数据分类

时间序列数据分析在工业&#xff0c;能源&#xff0c;医疗&#xff0c;交通&#xff0c;金融&#xff0c;零售等多个领域都有广泛应用。其中时间序列数据分类是分析时序数据的常见任务之一。本文将通过一个具体的案例&#xff0c;介绍 Intel 团队如何使用 TDengine 作为基础软件…

rocketmq消息发送源码学习

消息发送基本流程 消息发送流程主要的步骤&#xff1a;验证消息、查找路由、消息发送&#xff08;包含异常处理机制&#xff09;。 代码&#xff1a;同步消息发送入口 DefaultMQProducer#send public SendResult send(Message msg) throws MQClientException, RemotingExcep…

golang singleflight资料整理

https://www.cyningsun.com/01-11-2021/golang-concurrency-singleflight.html https://juejin.cn/post/7261897250648817701 https://segmentfault.com/q/1010000022916754 https://juejin.cn/post/6916785233509482509 https://segmentfault.com/a/1190000018464029

备忘录模式 行为型模式之八

1.定义 备忘录模式是一种行为型的软件设计模式&#xff0c;在不破坏封装的前提下&#xff0c;获取一个对象的内部状态&#xff0c;并在对象外保存该状态&#xff0c;当对象需要恢复到该状态时&#xff0c;对其进行恢复。 2.组成结构 原发器 &#xff08;Originator&#xff0…

超详细!主流大语言模型的技术原理细节汇总!

1.比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节&#xff1a;tokenizer、位置编码、Layer Normalization、激活函数等。 2. 大语言模型的分布式训练技术&#xff1a;数据并行、张量模型并行、流水线并行、3D 并行、零冗余优化器 ZeRO、CPU 卸载技术 ZeRo-offload、混合精度训…

pip安装或更新

在终端用pip安装时老是报错&#xff0c;把pip升级到最高版本还是不行 ERROR: Exception: Traceback (most recent call last): File "F:\software\anaconda\envs\tensorflow\lib\site-packages\pip\_vendor\urllib3\response.py", line 438, in _error_catcher yiel…

gcc和g++区别

一、什么是GNU编译器? GNU编译器&#xff08;GNU Compiler Collection&#xff0c;简称GCC&#xff09;&#xff0c;是一套由自由软件基金会所发展的编程器。GCC支持多种编程语言&#xff0c;包括C、C、Objective-C、Fortran、Ada、以及其它一些语言。它是Linux系统和很多类U…

Zabbix监控硬盘S.M.A.R.T.信息教程

S.M.A.R.T.是"Self-Monitoring, Analysis, and Reporting Technology"的缩写&#xff0c;它是一种硬盘自我监测、分析和报告技术。硬盘S.M.A.R.T.信息的主要用途是帮助用户和系统管理员监测硬盘的健康状态和性能&#xff0c;例如温度、振动、读写错误率、坏道数量等&…

Linux 部署 MinIO 分布式对象存储 配置为 typora 图床

前言 MinIO 是一款高性能的对象存储系统&#xff0c;它可以用于大规模的 AI/ML、数据湖和数据库工作负载。它的 API 与Amazon S3 云存储服务完全兼容&#xff0c;可以在任何云或本地基础设施上运行。MinIO 是开源软件&#xff0c;也提供商业许可和支持 MinIO 的特点有&#x…

用Jmeter进行接口自动化测试的工作流程你知道吗?

在测试负责人接受到测试任务后&#xff0c;应该按照以下流程规范完成测试工作。 2.1 测试需求分析 产品开发负责人在完成某产品功能的接口文档编写后&#xff0c;在核对无误后下发给对应的接口测试负责人。测试负责人拿到接口文档需要首先做以下两方面的工作。一方面&#…

点云采样方法

随机采样&#xff0c;网格采样&#xff0c;均匀采样&#xff0c;集合采样。 网格采样&#xff1a;用规则的网格对点进行采样&#xff0c;不能精确的控制采样点的数量 均匀采样&#xff1a;均匀的采样点云中的点&#xff0c;由于其鲁棒性(系统的健壮性)而更受欢迎 点云降采样…

Windows11更新后Chrome无法打开解决方案

引言 最近更新了win11后&#xff0c;chrome突然抽风无法打开了&#xff0c;不知道是不是微软的锅&#xff0c;上网查询发现似乎有很多人最近碰到了相同的问题&#xff0c;试了试最为广泛传播的方案–更改manifest文件。然而在我这无效&#xff0c;索性直接重装&#xff0c;发现…

vscode搭建c/c++环境

1. 安装mingw64 2.vscode安装c/c插件&#xff0c;run插件 3.在workspace/.vscode文件夹下新建三个文件&#xff1a; 1&#xff09;c_cpp_properties.json { "configurations": [ { "name": "Win32", "includePath": [ "${wor…

CentOS8的nmcli常用命令总结

nmcli常用命令 # 查看ip&#xff08;类似于ifconfig、ip addr&#xff09; nmcli# 创建connection&#xff0c;配置静态ip&#xff08;等同于配置ifcfg&#xff0c;其中BOOTPROTOnone&#xff0c;并ifup启动&#xff09; nmcli c add type ethernet con-name ethX ifname ethX…

vue怎样封装接口

Vue可以使用axios来发送HTTP请求&#xff0c;通过封装axios可以实现接口的统一管理和调用。下面是一个简单的封装接口的示例。 安装axios 在项目中安装axios依赖&#xff0c;可以使用npm或者yarn命令进行安装。 npm install axios --save创建api.js文件 在项目中创建一个ap…