UVALive 4864 Bit Counting --记忆化搜索 / 数位DP?
题目链接: 题目链接
题意:如果一个数二进制n有k位1,那么f1[n] = k,如果k有s位二进制1,那么f2[n] = f1[k] = s. 如此往复,直到fx[n] = 1,此时的x就是n的”K值“,现在要求[L,R]内的”K值“为X的数有多少个。(1<=L<=R<=10^18)
解法:首先可以看到10^18最多只有61位左右的数,所以我们只需处理1~61之间每个数有多少个1,即可知道1~61之间每个数”K值“是多少。
然后就将求[L,R]之间的个数变成求[1,R]-[1,L-1],所以我们只需数出对于每个数n,[1,n]之间有多少个数的”K值“为X即可。
对于二进制来说,可以这样搜索出来:
比如<=101001,要满足有k个1的数的个数,那么我们从高位往低位扫,扫到第一个1,那么现在有两种情况:
1.此处放1:那么就等于求<=1001时放k-1个1的数的个数
2.此处放0:那么后面就随便放了,为C[5][k]
所以如此递归的搜索就可得出答案,也可以用DP做。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std; int Count(ll state) {
int cnt = ;
while(state) {
if(state & 1LL) cnt++;
state >>= ;
}
return cnt;
}
int WEI(ll state) {
int cnt = ;
while(state) {
cnt++;
state >>= ;
}
return cnt;
}
ll C[][];
int in[]; void init()
{
C[][] = ;
for(int i = ; i < ; i++) {
C[i][] = ;
for(int j = ; j <= i; j++) {
C[i][j] = C[i - ][j] + C[i - ][j - ];
}
}
memset(in,,sizeof(in));
in[] = ;
for(int i=;i<=;i++)
in[i] = in[Count(i)]+;
}
int X; ll get(ll state,int cnt) {
if(state < ) return ;
int len = WEI(state);
if(len < cnt) return ; // not enough
if(cnt == ) return ; // no demand
return get(state-(1LL<<(len-)),cnt-) + C[len-][cnt];
} ll getsum(ll R,ll L) {
ll ans = ;
for(int i=;i<=;i++)
if(in[i]+ == X) ans += get(R,i)-get(L-,i);
return ans;
} int main()
{
init();
int i,j;
ll L,R;
while(scanf("%lld%lld%d",&L,&R,&X)!=EOF && L+R+X)
{
ll ans = ;
if(X == && L == 1LL) { puts(""); continue; }
if(X == && L == 1LL) ans--; //1's binary code is 1, but 1 is not in (X==1)
ans += getsum(R,L);
cout<<ans<<endl;
}
return ;
}
UVALive 4864 Bit Counting --记忆化搜索 / 数位DP?的更多相关文章
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- hdu_3562_B-number(记忆化搜索|数位DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 题意:给你一个n,为比n小的能整除13并数字中有13的数有多少个 题解:记忆化搜索:记dp[i] ...
- 【记忆化搜索/数位DP】zznu2175(长度为n的含有ACM的字符串)
随机字符串 题目描述 起名字什么的最麻烦,我们来生成一些随机字符串吧 生成的字符串当然是有要求的: .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM” ok,是不是很简 ...
- 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof
题目传送门 /* 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + ...
- 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty
题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...
- HDU 2476 String painter(记忆化搜索, DP)
题目大意: 给你两个串,有一个操作! 操作时可以把某个区间(L,R) 之间的所有字符变成同一个字符.现在给你两个串A,B要求最少的步骤把A串变成B串. 题目分析: 区间DP, 假如我们直接想把A变成B ...
- BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp
题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...
- POJ-1088 滑雪 (记忆化搜索,dp)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 86318 Accepted: 32289 Description Mich ...
- HDU 4597 Play Game (记忆化搜索博弈DP)
题意 给出2*n个数,分两列放置,每列n个,现在alice和bob两个人依次从任意一列的对头或队尾哪一个数,alice先拿,且两个人都想拿最多,问alice最后能拿到数字总和的最大值是多少. 思路 4 ...
随机推荐
- 【Win10开发】绘制静态UI
相信经历过Windows Insider的人对下面这个图都不会陌生,偶然看见邹欣老师领导的微软团队写了篇用xaml绘制这个静态页面,那咱也来亲手实验一番.唔...请做和放宽! 首先我们来看看xaml代 ...
- web前端--边框的特征
1.一个面试题:边框是什么形状的? 你可能认为是一个矩形的 细心地人可能说是 梯形 或者 三角形 比较合理的答案是 非矩形的 2.画三角形 将div的width height 都设置为0px bo ...
- UDS(ISO14229-2006) 汉译(No.1 范围)
ISO14229指定的数据链路是独立于诊断服务的,该数据链路允许测试仪(Client)操作ECU(Server)中的诊断功能(如电子燃油喷射.变速箱.ABS等)并接入一条嵌入车辆的串行数据链路.它指定 ...
- python之进程与线程
什么是操作系统 可能很多人都会说,我们平时装的windows7 windows10都是操作系统,没错,他们都是操作系统.还有没有其他的? 想想我们使用的手机,Google公司的Androi ...
- 《Ext JS模板与组件基本框架图----组件》
本节主要从七个方面讲解组件,组件时什么,它的作用,它的构架,以及怎么创建和周期还有常见的配置项,属性方法和事件以及其层级是什么都进行整理,希望对大家有帮助. 组件的基础知识.png 2 Abstrac ...
- C#综合揭秘——通过修改注册表建立Windows自定义协议
引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...
- 【转】visio中关于shape属性的修改和读取
PS: 本文转自: http://blog.sina.com.cn/s/blog_6bcfb9420100wzxf.html visio中都是shape,shape就是一个对象,要想实现对shape ...
- SharePoint 2013 托管导航及相关配置
设计完善的导航可告诉您网站的用户大量有关网站所提供业务.产品和服务的信息.通过更新导航背后的分类法,可以推动业务并保持更新,而不必在过程中重新创建其网站导航.在 SharePoint 2013 中,可 ...
- ListView实现点击事件以及总结
差点吓死我了,好不容易写的博客没有了,还好有自动保存功能,不然我真的是呜呜... ---恢复内容开始--- 开学一个月了,终于可以看见自己的作品雏形了. 从一个小白到现在半年了,觉得日子过得比较充实, ...
- 自定义控件之圆形的image
需要添加点击事件的的时候在自定义的控件中覆写OnTouchEvent():方法进行点击事件的分发 package com.example.administrator.mvp.ui.widget; im ...