洛谷 P6218 [USACO06NOV] Round Numbers S
洛谷 P6218 [USACO06NOV] Round Numbers S
题目描述
如果一个正整数的二进制表示中,\(0\) 的数目不小于 \(1\) 的数目,那么它就被称为「圆数」。
例如,\(9\) 的二进制表示为 \(10011001\),其中有 \(2\) 个 \(0\) 与 \(2\) 个 \(1\)。因此,\(9\) 是一个「圆数」。
请你计算,区间 \([l,r]\) 中有多少个「圆数」。
输入格式
一行,两个整数 \(l,r\)。
输出格式
一行,一个整数,表示区间 \([l,r]\)中「圆数」的个数。
输入输出样例
输入 #1
2 12
输出 #1
6
说明/提示
【数据范围】
对于 \(100\%\) 的数据,\(1\le l,r\le 2\times 10^9\)。
【样例说明】
区间 \([2,12]\) 中共有 \(6\) 个「圆数」,分别为 \(2,4,8,9,10,12\)
分析
比较套路的数位 \(DP\)
数位 \(DP\) 的实质就是换一种暴力枚举的方式,使得新的枚举方式满足 \(DP\) 的性质,然后记忆化就可以了。
首先,我们要进行 \(DP\) 的话,肯定要定义一个 \(f\) 数组存储我们计算过的值
因为这道题和数位有关,所以第一位我们要定义当前遍历到了第几位
而且我们还要判断二进制下 \(0\) 的数量和 \(1\) 的数量
所以,我们设 \(f[i][j][k]\) 为当前遍历到第 \(i\) 位,二进制下 \(1\) 的数量为 \(j\),\(0\) 的数量为 \(j\) 的数的个数
主函数我们用差分的思想搞一下即可
signed main(){
memset(f,-1,sizeof(f));
int l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",solve(r)-solve(l-1));
return 0;
}
然后是 \(solve\) 函数
这里的 \(cnt\) 是用来记录当前的数在二进制下有多少位,\(num\) 数组是用来记录这个数每一二进制位上的数字的
这个函数的变量只有一个 \(xx\), 返回值是 \(0\) 到 \(xx\) 之间圆数的个数
int solve(int xx){
memset(num,0,sizeof(num));
cnt=0;
while(xx){
num[++cnt]=xx&1ll;
xx>>=1ll;
}
return dfs(cnt,0,0,1,1);
}
下面的 \(dfs\) 函数是最重要的部分
int dfs(int ws,int tot1,int tot0,bool lim,bool zer){
if(ws==0) {
if(tot1<=tot0) return 1;
return 0;
}
if(lim==0 && zer==0 && f[ws][tot1][tot0]!=-1) return f[ws][tot1][tot0];
int up=1,ans=0;
if(lim) up=num[ws];
for(int i=0;i<=up;i++){
if(zer==1 && i==0) ans+=dfs(ws-1,0,0,lim && i==up,1);
else ans+=dfs(ws-1,tot1+(i==1),tot0+(i==0),lim && i==up,0);
}
if(lim==0 && zer==0)f[ws][tot1][tot0]=ans;
return ans;
}
它的五个参数分别为:当前处理到第 \(ws\) 位
\(0\) 的个数 \(tot0\) ,\(1\) 的个数 \(tot1\)
\(lim\) 特判前一位是否为范围内的最大值
\(zer\) 记录有没有前导零
终止条件就是处理到最后一位
具体的边界看一下下面的模板
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int f[60][60][60],num[55],cnt,sum[55];
const int mod=1e7+7;
int dfs(int ws,int tot1,int tot0,bool lim,bool zer){
if(ws==0) {
if(tot1<=tot0) return 1;
return 0;
}
if(lim==0 && zer==0 && f[ws][tot1][tot0]!=-1) return f[ws][tot1][tot0];
int up=1,ans=0;
if(lim) up=num[ws];
for(int i=0;i<=up;i++){
if(zer==1 && i==0) ans+=dfs(ws-1,0,0,lim && i==up,1);
else ans+=dfs(ws-1,tot1+(i==1),tot0+(i==0),lim && i==up,0);
}
if(lim==0 && zer==0)f[ws][tot1][tot0]=ans;
return ans;
}
int solve(int xx){
memset(num,0,sizeof(num));
cnt=0;
while(xx){
num[++cnt]=xx&1ll;
xx>>=1ll;
}
return dfs(cnt,0,0,1,1);
}
signed main(){
memset(f,-1,sizeof(f));
int l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",solve(r)-solve(l-1));
return 0;
}
洛谷 P6218 [USACO06NOV] Round Numbers S的更多相关文章
- 【题解】P6218 [USACO06NOV] Round Numbers S
题目传送门 这是一道数位DP. 令 \(dp_{i,j,k}\) 为满足由 \(i\) 位组成,且其中有 \(j\) 个1,第 i 位(从右往左数)为 \(k\) 的二进制数的数量. 可以得出状态转移 ...
- 洛谷P1879 [USACO06NOV]玉米田Corn Fields(状压dp)
洛谷P1879 [USACO06NOV]玉米田Corn Fields \(f[i][j]\) 表示前 \(i\) 行且第 \(i\) 行状态为 \(j\) 的方案总数.\(j\) 的大小为 \(0 \ ...
- 洛谷P2866 [USACO06NOV]糟糕的一天Bad Hair Day
P2866 [USACO06NOV]糟糕的一天Bad Hair Day 75通过 153提交 题目提供者洛谷OnlineJudge 标签USACO2006云端 难度普及/提高- 时空限制1s / 12 ...
- 【题解】洛谷P1879 [USACO06NOV] Corn Fields(状压DP)
洛谷P1879:https://www.luogu.org/problemnew/show/P1879 思路 把题目翻译成人话 在n*m的棋盘 每个格子不是0就是1 1表示可以种 0表示不能种 相邻的 ...
- 洛谷P1467 循环数 Runaround Numbers
P1467 循环数 Runaround Numbers 89通过 233提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 循环数是 ...
- 洛谷 P1879 [USACO06NOV]玉米田 解题报告
P1879 [USACO06NOV]玉米田Corn Fields 题目描述 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ ...
- 洛谷P2867 [USACO06NOV]大广场Big Square
P2867 [USACO06NOV]大广场Big Square 题目描述 Farmer John's cows have entered into a competition with Farmer ...
- 洛谷——P2865 [USACO06NOV]路障Roadblocks
P2865 [USACO06NOV]路障Roadblocks 题目描述 Bessie has moved to a small farm and sometimes enjoys returning ...
- 洛谷 P2867 [USACO06NOV]大广场Big Square
P2867 [USACO06NOV]大广场Big Square 题目描述 Farmer John's cows have entered into a competition with Farmer ...
随机推荐
- node 学习资源网址---存根
Node.js 使用场景 & 实战 Node.js雪球实战半年谈 雪球上的 Node.js 国内有哪些网站使用了 Node.js Node.js & Uber Node.js 的优势和 ...
- js获得url传过来的参数
function getParam(url) { var arr = url.split('?'); //取?以后 var a ...
- MySQL(四)数据备份与还原
数据备份与还原: 备份:将当前已有的数据或者记录保留 还原:将已经保留的数据恢复到对应的表中 为什么要做备份还原: 1.防止数据丢失:被盗.误操作 2.保护数据的记录 数据备份还原的方式很多:数据表备 ...
- 一个简单的Android小实例分享,包含recycleView与recyclerView嵌套
先上图: 1.首页 2.第二页 3.第三页 项目目录: 代码不多,本人太懒,就不贴了 项目地址:
- 一文带你学习DWS数据库用户权限设计与管理
前言 本文将介绍DWS基于RBAC(Role-Based Access Control,基于角色的访问控制)的数据库用户权限管理.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成 ...
- DFS与BFS——理解简单搜索(中文伪代码+例题)
新的方法和概念,常常比解决问题本身更重要. ————华罗庚 引子 深度优先搜索(Deep First Search) 广度优先搜索(Breath First Search) 当菜鸟们(比如我)初步接触 ...
- 解决移动端rem加载瞬间页面错乱的方法(放大或者缩小)
移动端布局有很多种,这里我们最常使用到rem+百分比的布局方式(高度/字体设置rem单位,宽度设置百分比)来处理屏幕兼容,这种方法在兼容上是比较不错的,可以使得字体以及整体适应各种大小的屏幕,可以解决 ...
- 7.11 NOI模拟赛 qiqi20021026的T1 四个指针莫队 trie树
LINK:qiqi20021026的T1 考场上只拿到了50分的\(nq\)暴力. 考虑一个区间和一个区间配对怎么做 二分图最大带权匹配复杂度太高. 先考虑LCS的问题 常见解决方法是后缀数组/tri ...
- 一本通 1783 矩阵填数 状压dp 容斥 计数
LINK:矩阵填数 刚看到题目的时候感觉是无从下手的. 可以看到有n<=2的点 两个矩形. 如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x. ...
- 数据分析学习 third week (7.29~8.4)
概率分布简介 简单地介绍下常用概率分布的理论知识. 基础概念 1.概率 概率直观上是指一个事件发生可能性大小的数量指标 概率的统计定义:在不变的条件下,重复进行$n$次试验,事件$A$发生的频率稳定在 ...