当前位置: 首页 > news >正文

luoguP8764 [蓝桥杯 2021 国 BC] 二进制问题

luogu题目传送门

题目描述

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

输入格式

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

输出格式

输出一个整数表示答案。

输入输出样例

输入 #1

7 2

输出 #1

3

说明/提示

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

对于 60% 的评测用例, 1\leq N \leq 2*10^{9},1≤K≤30 。

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

蓝桥杯 2021 国赛 B 组 H 题(C 组 J 题)。

思路

像这样时间复杂度O(N)都要超的题目显然是数位dp,只是将原来的十进制改为二进制就可以了

对于深搜的第二个参数,我们只需要定义一个sum,记录已经选了几个 1 

最后退出时如果 sum 不为 k 就返回 0,否则返回 1

Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
ll f[205][205][2],a[205],k;
ll dfs(ll pos,ll sum,ll lim){if(pos==0){if(sum==k)return 1;//sum==k 才满足条件 return 0;}if(f[pos][sum][lim]!=-1)return f[pos][sum][lim];//如果有了就直接返回 ll ans=0;ll en=(lim?a[pos]:1);//小细节:二进制最大为 1 ,不要打成 9 for(ll i=0;i<=en;i++){ans+=dfs(pos-1,sum+(i==1),lim&&i==en);}return f[pos][sum][lim]=ans;
}
ll solve(ll x){ll o=0;memset(f,-1,sizeof(f));memset(a,0,sizeof(a));while(x>0){//将 x 转为二进制 a[++o]=x%2;x/=2;}return dfs(o,0,1);
}
int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);ll r;cin>>r>>k;cout<<(solve(r)-solve(0));return 0;
}

http://www.lryc.cn/news/537746.html

相关文章:

  • 图形渲染(一)——Skia、OpenGL、Mesa 和 Vulkan简介
  • 浏览器打开Axure RP模型
  • 【计算机网络】数据链路层数据帧(Frame)格式
  • 平面与平面相交算法杂谈
  • web集群(LVS-DR)
  • 更高效实用 vscode 的常用设置
  • win11 终端乱码导致IDE 各种输出也乱码
  • 对于简单的HTML、CSS、JavaScript前端,我们可以通过几种方式连接后端
  • Flutter中 List列表中移除特定元素
  • DeepSeek从入门到精通(清华大学)
  • 动态规划:解决复杂问题的高效策略
  • 【kafka系列】Kafka事务的实现原理
  • 网络将内网服务转换到公网上
  • c#自动更新-源码
  • 爬虫实战:利用代理ip爬取推特网站数据
  • git使用,注意空格
  • 138,【5】buuctf web [RootersCTF2019]I_<3_Flask
  • docker 运行 芋道微服务
  • C++ Primer 函数重载
  • 【Rust中级教程】1.6. 内存 Pt.4:静态(static)内存与‘static生命周期标注
  • 【设计模式】【行为型模式】解释器模式(Interpreter)
  • 修改OnlyOffice编辑器默认字体
  • React echarts柱状图点击某个柱子跳转页面
  • wordpress主题插件开发中高频使用的38个函数
  • ElasticSearch基础和使用
  • qt-C++笔记之QGraphicsScene和 QGraphicsView中setScene、通过scene得到view、通过view得scene
  • 小白win10安装并配置yt-dlp
  • 【kafka系列】broker
  • 用大模型学大模型05-线性回归
  • Python实现AWS Fargate自动化部署系统