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

蓝桥杯 二进制问题 刷题笔记

8.二进制问题 - 蓝桥云课

 存入N的二进制每一位作为基准数组 算出方案数

从高位往低位用dfs枚举每一位是放1还是放0

#include<iostream>
#include<vector>
#define ll long long
using namespace std;ll dp[65][65];
ll num;
ll k;
vector<ll> vec;ll cal(ll n,ll k){if(dp[n][k]) return dp[n][k]; //记忆化搜索 如果已经处理过 直接返回C(n,k) if(n==k) return 1;//C(n,n) = 1;if(k==0) return 1;//C(n,0) = 1;if(n<k) return 0;//n不够位置给K放 直接返回 0 return dp[n][k]=cal(n-1,k-1)+cal(n-1,k);//n里面选k个位置放1  等于当前位置放1 + 当前位置不放1 的方案数的总和 递归计算 
}ll dfs(int pos,int last){//last 已经放置的K的个数//pos当前处理到哪一位了//出口 if(last==k) return 1;if(pos<0||last>k)return 0;ll res=0;if(vec[pos]==1){//如果当前位置为 1 可以选择放 1 或者放 0  res+=cal(pos,k-last);  // 如果选则放0 还剩下pos个位置 (初始一共pos+1个位置 0 到pos) // 这pos个位置随意选k-last个1 所以直接用组合数加上 res+=dfs(pos-1,last+1);//当前位置放1 处理下一位 }else res+=dfs(pos-1,last);//当前位置不为1,保持与原数二进制相等 继续处理下一位 return res;
}int main(){scanf("%lld %d",&num,&k);while(num){vec.push_back(num%2);num/=2;}//vec.size()  二进制的位数 
//vec.size()-1 最高位的索引 cout<<endl;ll ans=dfs(vec.size()-1,0);cout<<ans<<'\n';return 0;
}

cal函数的可以算出组合数的原因来自于杨辉三角

由顶层的1 可以加出下面的组合数

相关文章:

  • Linux操作系统简介:从开源内核到技术生态
  • BeautifulSoup 库的使用——python爬虫
  • AWS EC2完全指南:如何快速搭建高性能云服务器?
  • maven的安装与配置、IDEA集成maven
  • BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View
  • 实操基于MCP驱动的 Agentic RAG:智能调度向量召回或者网络检索
  • 23、.NET和C#有什么区别?
  • 鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法
  • C语言 —— 铭纹织构未诞之镜 - 预处理详解
  • AIGC通信架构深度优化指南
  • 【Qt】QMainWindow类
  • leetcode 1035. Uncrossed Lines
  • css3新特性第三章(文本属性)
  • AI Agent破局:智能化与生态系统标准化的颠覆性融合!
  • 【技术派后端篇】Redis实现统计计数
  • JavaScript 性能优化
  • 【数据分析实战】使用 Matplotlib 绘制散点图
  • 第一讲 生成式ai是什么
  • 深度解析算法之前缀和
  • Linux命令-Shell编程
  • 成都市政府秘书长王忠诚调任遂宁市委副书记
  • 稳健开局!今年粮食产量瞄准1.4万亿斤
  • 牛市早报|李强:在一些关键的时间窗口,推动各方面政策措施早出手、快出手
  • 习近平会见柬埔寨国王西哈莫尼
  • 经济日报刊文:从康养旅居看银发经济
  • 国台办:大陆经济前景好不好,事实最有说服力