数位dp D - Count The Bits
这个题目时给你k,b 让你求从0到2^b-1这些数中有多少个数可以整除k,并求出这个数二进制表示的1的个数
分析完题目之后就是对数进行处理。
首先我们要想怎么去定义dp,感觉还是很难想啊,那就想想怎么去处理这些数来满足题目要求
既然时二进制的表示,那么我们就把这个当作二进制来求所以这个时候枚举就是从0到1,然后我们需要一个数来表示这个二进制中1的个数,还需要一个数来表示这个数的大小
这样子dp就应该比较好定义了,dp[i][j][k] 第i位,这个数的大小,其中二进制含有1 的个数。
但是这个数字可以非常大,难道我们就定义一个超级大的数组吗?
肯定是不可以的,观察题目发现,我们是要求这个数字整除k,
如果你对于取模足够了解的话,你就会知道,如果我们要判断一个数对某一个数是的余数,我们可以边取模边写这个数字,
比如说1234 对于4 取模
那我们先出4 对4取模一次,然后 再是对取模之后的结果 *10 之后加上 3 然后再取模。。。
所以这个时候这一维度的数字大小就可以降低到k的大小了。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mod = 1000000009;
ll dp[130][1010][130]; //dp[i][j][k] 其中i代表第i位,j代表这个数的大小,因为我是要k的倍数,所以对k进行取膜即可,k就是表示这数化成二进制含有1的个数
int k, b; ll dfs(int pos,int num,int sum,bool limit)
{
if (pos == -1) return num ? 0 : sum;
if (!limit&&dp[pos][num][sum] != -1) return dp[pos][num][sum];
ll ans = 0;
for(int i=0;i<=1;i++)
{
ans += dfs(pos - 1, (num * 2 + i) % k, sum + i, limit&&i);
ans %= mod;
}
if (!limit) dp[pos][num][sum] = ans;
return ans;
} ll solve()
{
return dfs(b - 1, 0, 0, true);
} int main()
{
scanf("%d%d", &k, &b);
memset(dp, -1, sizeof(dp));
printf("%I64d\n", solve());
return 0;
}
数位dp D - Count The Bits的更多相关文章
- 蒟蒻的数位DP专题总结
BZOJ 1026: [SCOI2009]windy数: 题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1026 d ...
- 数位dp & 热身训练7
数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...
- BZOJ1833 ZJOI2010 count 数字计数 【数位DP】
BZOJ1833 ZJOI2010 count 数字计数 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包 ...
- 【BZOJ-1833】count数字计数 数位DP
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 2494 Solved: 1101[Submit][ ...
- hdu 5106 Bits Problem(数位dp)
题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...
- BZOJ_1833_[ZJOI2010]count 数字计数_数位DP
BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...
- uva 10712 - Count the Numbers(数位dp)
题目链接:uva 10712 - Count the Numbers 题目大意:给出n,a.b.问说在a到b之间有多少个n. 解题思路:数位dp.dp[i][j][x][y]表示第i位为j的时候.x是 ...
- bzoj1833: [ZJOI2010]count 数字计数 数位dp
bzoj1833 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. O ...
- 1363: Count 101 (经典数位dp)
1363: Count 101 Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: ...
随机推荐
- 深入理解Redis内存模型
前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...
- JVM虚拟机深入理解+GC回收+类加载
旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/81455449 一,前言 本文章是读了“深入理 ...
- 用js实现博客打赏功能
前几天在一个博客中看到有一个打赏功能.其实简单说来就是在页面中加入动态DOM节点,使用的也是简单的HTML.CSS.JS这些前端的一些简单知识.在GitHub上有开源的代码,这里稍加改造就可以用在自己 ...
- vue+vuecli+webapck2项目配置文件详解
1.文件结构 ├─build │ ├─build.js │ ├─check-versions.js │ ├─dev-client.js │ ├─dev-server.js │ ├─utils.js │ ...
- CSS效果:CSS3实现模拟select以及其中的三角形
如图实现这样的效果: html代码如下: <div class="select-bg"> <select class="select-green&quo ...
- Android为TV端助力 android 在5.0以后不允许使用隐式Intent方式来启动Service
android5.0以后不能使用隐式intent :需要指定Intent的ComponentName信息:intent.setComponent(xxx),或指定Intent的setPackage(& ...
- XBanner的简单使用轮播
导入依赖 implementation 'jp.wasabeef:glide-transformations:3.0.1' implementation 'com.xhb:xbanner:1.2.2' ...
- 章节四、2-Switch语句
package introduction5; public class SwitchDemo { //switch用于固定值的判断,如星期.人的性别 //if用于判断区间.范围,能够用switch进行 ...
- git 入门教程之基本概念
基本概念 了解工作区,暂存区和版本库的区别和联系有助于我们更好理解 git 的工作流程,了解命令的操作意图. git 和其他版本控制系统如 svn 的不同之处就是有暂存区的概念. 基本概念 工作区 | ...
- 关于谷歌JSV8与微软JSRT的性能比较
首先,我并没有得到实际的比较结果,望有兴趣的朋友可以帮助完成这个比较. benchmarksgame,提供了各种语言的性能比较,但都为linux下的测试,很难比较谷歌与微软的东西. 众所周知,JSV8 ...