蓝桥杯第1593题——二进制问题

题目描述

小蓝最近在学习二进制。他想知道 1 到 N 中有多少个数满足其二进制表示中恰好有 K 个 1。你能帮助他吗?

输入描述

输入一行包含两个整数 N 和 K。

输出描述

输出一个整数表示答案。

输入输出样例

示例

输入

7 2

输出

3

评测用例规模与约定

对于 30% 的评测用例,1 ≤ N ≤ 10^6,1 ≤ K ≤ 10。

对于 60% 的评测用例,1 ≤ N ≤ 2×10^9,1 ≤ K ≤ 30。

对于所有评测用例,1 ≤ N ≤ 10^18,1 ≤ K ≤ 50。

解题思路

这道题大致的问题就是给定一排位置,填或者不填的问题,我们可以考虑使用数位dp的思想。

对于n个位置填k个1的方案数量是典型的排列组合,虽然K的值最高只有50,计算排列组合C_{m}^{n}也是可以实现的,但这里我们综合考虑使用帕斯卡公式,即C_{n}^{m} = C_{n-1}^{m} + C_{n-1}^{m-1}

于是我们可以定义dp[i][j]:在长度为 i 的二进制序列中填 j 个 1 的组合数。

帕斯卡公式的证明就是这道题的原理,即n个数中取m个元素的组合数——包含第一个数不取,在剩下的n-1个数中取m个数;和第一个数取,在剩下n-1个数中取m-1个数的总和。

题目要求统计包含K个1的二进制数的数量,以N的二进制为1011,取k=3为例,我们可以将1011分解为以下几个区间考虑:0000~0111、1000~1001、1010~1010、1011。

这样分的理由是,第一个数不填1,考虑剩下3个位置填3个1的方法总数,这不就正好是在000~111这个长度为3的二进制序列中填3个1的排列总数吗,即dp[3][3]。

那么比111更大的数即代表着第一个数一定填1,在第二个区间中,我们是在第一个数填1的情况下,考虑第三个数不填1的排列数,即剩下1个位置填2个1满足要求——dp[1][2]。

第三个区间考虑在第一个位置和第三个位置都填1的情况下,第四个位置不填1的情况,那么就要加上在剩下0个位置填1个1的组合数——dp[0][1]。

最后还剩一个单独的1011,其目的是要留着特判,因为我们前面一直都是在遇到1的情况下考虑这个位置不填1有多少种满足要求的可能性,那么我们就会漏掉最后一个位置填1的情况没有计算,在最后一个位置填1,并且刚好满足k个1的时候,就需要增加一种组合数。

根据上述逻辑,此数据的答案即为:dp[3][3] + dp[1][2] + dp[0][1] + 1  =  1 + 0 + 0 + 1  =  2种

import java.util.*;
import java.io.*;public class Main {static long n;static int k;static long[][] dp;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextLong();k = sc.nextInt();init();System.out.println(solve(n));}public static long solve(long n) {char[] s = Long.toBinaryString(n).toCharArray();long ans = 0;// ones 用于记录已经填的1的数量int ones = 0;for (int i = 0; i < s.length; i++) {int po = s.length - i;if (s[i] == '1') {// 先考虑位置po不填1的可能性ans += dp[po - 1][k - ones];// 然后填上一个1并记录ones++;// 由于在ones等于k的时候还有一次后续什么都不填的可能性,即dp[xxx][0] = 1// 所以只在填超了以后才breakif (ones > k) {break;}}// 如果最后一位刚好填够k个1,会漏计算1种情况,需要补上if (po == 1 && ones == k) {ans++;}}return ans;}public static void init() {dp = new long[65][65];dp[0][0] = 1;for (int i = 1; i < 65; i++) {for (int j = 0; j <= i; j++) {if (j == 0) {dp[i][j] = 1;} else {dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];}}}}
}

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

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

相关文章

如何解决redis里的大key问题

Redis中什么是Big Key&#xff08;大key&#xff09;问题&#xff1f;如何解决Big Key问题&#xff1f;_redis bigkey-CSDN博客

【SQL】1633. 各赛事的用户注册率(COUNT函数 表达式用法)

题目描述 leetcode题目&#xff1a;1633. 各赛事的用户注册率 Code select contest_id, round(count(*)/(select count(*) from Users)*100, 2) as percentage from Register group by contest_id order by percentage desc, contest_id ascCOUNT()函数 COUNT函数用法&#…

C语言联合体,枚举详解

1. 前言 前边我们已经了解了结构体在C语言当中是如何使用的&#xff0c;今天咱来一起聊一聊联合体与枚举在C语言当中又是如何运用的呢 2. 联合体的了解与运用 2.1 联合体的声明&#xff1a; 相比于结构体来说&#xff0c;联合体最大的区别就在于它是联合体当中所有成员共用一…

易语言控件绑定数据库

易语言是一门中文编程语言&#xff0c;由国人开发&#xff0c;虽然比较冷门&#xff0c;但是在有些场合却非常流行&#xff0c;比如自动化脚本&#xff0c;还有开发外挂。 在易语言中&#xff0c;只要控件的属性里有数据源的都可以与数据库的数据绑定&#xff0c;以下将演示易…

cassandra设置密码

给cassandra设置密码 把cassandra.yaml得第64页 authenticator: AllowAllAuthenticator 改成 authenticator: PasswordAuthenticator 重新启动cassandra ./cqlsh 192.168.200.10 -ucassandra -pcassandra 设置完密码授权后&#xff0c;会默认有个cassandra用户(密码cassa…

广东政务区块链平台项目:BSN专网助力数字政府建设,助推电子政务现代化

区块链作为数字中国的重要技术底座&#xff0c;是数据交易、金融结算、国际贸易、政务监管、医药食品、民生安全等领域的重要信息基础设施&#xff0c;也是数字经济发展的重要引擎。我国明确要加强区块链等数字技术的自主创新&#xff0c;构筑起数字经济竞争新优势。 2023年&a…

Linux:基本指令篇

文章目录 前言1.ls 指令2.pwd命令3.cd 指令4.touch指令5.mkdir指令&#xff08;重要&#xff09;6.rmdir指令 && rm 指令&#xff08;重要&#xff09;7.man指令&#xff08;重要&#xff09;8.cp指令&#xff08;重要&#xff09;9.mv指令&#xff08;重要&#xff09…

通过Telnet访问网络设备

要通过 Telnet 访问网络设备&#xff0c;需要通过Console端口对网络设备进行基本配置&#xff0c;例如&#xff0c;IP地址、子网掩码、用户名和登录密码等。本实验以路由器为例&#xff0c;交换机远程管理只是接口名字不同而已&#xff0c;路由器用物理接口&#xff0c;交换机用…

mac mini m1芯片 Xcode 15.3 各种报错的问题

错误一&#xff1a; /Users/mac/Desktop/Test_project/mobile-ios/Test/Test-Bridging-Header.h:4:9 failed to emit precompiled header /Users/mac/Library/Developer/Xcode/DerivedData/App-apvcgkuclncgfqdlzqcoffyaexos/Build/Intermediates.noindex/PrecompiledHeaders/…

缓存和缓存的常用使用场景

想象一下,一家公司在芬兰 Google Cloud 数据中心的服务器上托管一个网站。对于欧洲用户来说,加载可能需要大约 100 毫秒,但对于墨西哥用户来说,加载需要 3-5 秒。幸运的是,有一些策略可以最大限度地减少远程用户的请求延迟。 这些策略称为缓存和内容交付网络 (CDN),它们是…

纯代码安装pytorch-gpu版

import os os.system("nvidia-smi") #查看cuda版本号 #os.system("pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121") os.system("python") os.system("pip list") torch.cuda.is_a…

【星海随笔】Ubuntu22.04忘记密码

服务器篇: 有问题可留言。 第一步 远程console界面进入该设备 并重启该设备 如果看到这个界面情况 则点击右上角按钮 【发送 Ctrl+Alt+Delete】 调出grub启动菜单 NOTE:启动的后半段去点击这个按钮,前半段一直点会一直重启 如果是直连服务器,可以快速按下shift键。调出gru…

算法 第24天 回溯1

77 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 def backtracking(n,k,startIndex,path,result):if len(path)k:result.append(path[:]) # 这里为什么要用切片return for i in range(1,n-(k-len(path))…

C++ 标准库类型vector

C/C总述&#xff1a;Study C/C-CSDN博客 目录 容器特性 1.顺序序列 2.动态数组 3.能够感知内存分配器的&#xff08;Allocator-aware&#xff09; 定义和初始化vector对象 vector的增 vector的删 vector的改 vector中元素的访问 vector的大小与容量 标准库中的 ve…

RUST 中什么情况下要使用 .unwrap ( )

在Rust编程语言中&#xff0c;.unwrap() 方法主要应用于处理 Result 或 Option 类型。这两种类型常用于处理可能会出现错误或缺失值的情况。 Result<T, E>: 当你有一个 Result 类型的变量&#xff0c;并且你知道或者期望它一定是 Ok 值&#xff08;即不包含错误&#xf…

ROS 基本

ROS创建自己的功能包 ROS中工作空间(workspace)是一个存放工程开发相关文件的文件夹&#xff0c;其中有四个文件夹。 src:代码空间(Source Space)build:编译空间(Build Space)devel:开发空间(Development Space)install:安装空间(Install Space) OK接下来创作工作空间&#…

新能源微电网数据集

需要的同学私信联系&#xff0c;推荐关注上面图片右下角的订阅号平台 自取下载。 微电网&#xff08;Micro-Grid&#xff0c;MG&#xff09;由分布式电源&#xff08;分布式光伏、分散式风电、燃气轮机、电化学储能、超级电容等&#xff09;、用电负荷&#xff08;重要、可调等…

SpringCloud学习(2)-OpenFeign

1.OpenFeign简介 Feign是一个声明式的Web服务客户端&#xff08;Web服务客户端就是Http客户端&#xff09;&#xff0c;让编写Web服务客户端变得非常容易&#xff0c;只需创建一个接口并在接口上添加注解即可。 cloud官网介绍Feign&#xff1a;Spring Cloud OpenFeign OpenF…

【Prometheus】关于Prometheus告警的一些使用心得

关于Prometheus告警的一些使用心得 指标规整及联动判定告警多条件判断告警路由分组和接受者以URL参数区分的多个Webhook的配置使用Alertmanger的API 之前一直有在用Prometheus的规则引擎配一些告警&#xff0c;感觉内容还是比较多&#xff0c;做一下整理&#xff0c;方便以后用…