题目: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的更多相关文章

  1. 蒟蒻的数位DP专题总结

    BZOJ  1026: [SCOI2009]windy数: 题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1026           d ...

  2. 数位dp & 热身训练7

    数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...

  3. BZOJ1833 ZJOI2010 count 数字计数 【数位DP】

    BZOJ1833 ZJOI2010 count 数字计数 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包 ...

  4. 【BZOJ-1833】count数字计数 数位DP

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][ ...

  5. hdu 5106 Bits Problem(数位dp)

    题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...

  6. BZOJ_1833_[ZJOI2010]count 数字计数_数位DP

    BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...

  7. 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是 ...

  8. bzoj1833: [ZJOI2010]count 数字计数 数位dp

    bzoj1833 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. O ...

  9. 1363: Count 101 (经典数位dp)

    1363: Count 101 Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: ...

随机推荐

  1. Mac下写博客工具MarsEdit相关资料

    参考资料: https://www.maoshu.cc/967.html 下载地址: https://www.red-sweater.com/marsedit/ 博客园的配置: http://www. ...

  2. virtualbox中设置u盘启动

    1.在磁盘管理中查看u盘的磁盘号X 2.管理员运行cmd,进入virtualbox目录 3.运行命令: VBoxManage internalcommands createrawvmdk -filen ...

  3. react学习(四)之设置 css样式 篇

    react中设置css样式 方法一: 行内样式:使用{{  }},与正常jsx中插入js代码不一样,这里需要两个括号. <div style={ { float: 'right',} }> ...

  4. nginx部署与安装

    1.在学习ngnix的时候,免不了需要进行安装,安装其实很简单,一个shell脚本就可以搞定可以参考如下 使用root用户执行nginx-install.sh脚本即可,脚本如下: #!/bin/bas ...

  5. Html5、css、JavaScript基础

    一.HTML学习 HTML样式Css 内联样式- 在HTML元素中使用"style" 属性 内部样式表 -在HTML文档头部 <head> 区域使用<style& ...

  6. centos7学习笔记-安装配置apache

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装apache #yum install httpd 2.配置开机启动 systemctl enable httpd 3. ...

  7. django请求和响应

    本文转载自https://blog.csdn.net/xiaogeldx/article/details/88096341 HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建 ...

  8. Android项目实战(五十):微信支付 坑总结

    大部分APP必备需求,使用总结 Android接入文章在此:官方文档 文档很简单,Android分为四步: 1.后台配置 2.Android 内 注册appId 3.Android 内 调起支付 4. ...

  9. uni-app 如何在当前页调上个页面的方法

    1.获取上个页面 var pages = getCurrentPages();//当前页 var beforePage = pages[pages.length - 2];//上个页面 2.在当前页调 ...

  10. 新的 Centos 服务器初始化配置

    当你初次创建新的 Centos 服务器的时候, Centos 默认的配置安全性和可用性上会存在一点缺陷(运维人员往往会有初始化的脚本).为了增强服务器的安全性和可用性,有些配置你应该尽快地完成. 这篇 ...