1833: [ZJOI2010]count 数字计数——数位dp
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1833
省选之前来切一道裸的数位dp。。
题意
统计[a,b]中0~9每个数字出现的次数(不算前导零)。
我的做法
首先把询问的[a,b]拆成[0,b]减去[0,a-1]的个数。
我们考虑算前导零的情况。此时可以逐位确定数字:如果某一位的数字<给定的数在那位的数字,那么显然后面的数字可以随便取,于是把所有后面随便取的10^k个数字之中的0~9的出现次数统计一下(这个稍微推一推就出来了嘛...),并且加上该位出现的数字出现的次数。
然后减去多统计的0的个数,这个也只要从前往后算一下就出来了。具体可以看代码。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[15], num[2][15], p[15];
void work(ll x, ll *n){
int k=0;
for(ll i=x; i; i/=10) a[k++]=i%10; //拆分各位数字
for(int i=k-1; i>=0; --i){ //逐位统计数字(算前导零
if(i) for(int j=0; j<10; ++j) n[j]+=i*p[i-1]*a[i];
for(int j=0; j<a[i]; ++j) n[j]+=p[i];
n[a[i]]+=x%p[i]+1;
}
for(int i=k-1; i>=1; --i) n[0]-=(k-i)*9*p[i-1]; //减去多统计的0的个数
n[0]-=k;
}
int main(){
ll x,y;
cin>>x>>y;
p[0]=1;
for(int i=1; i<=12; ++i) p[i]=p[i-1]*10;
work(x-1,num[0]); work(y,num[1]);
for(int i=0; i<9; ++i) cout<<num[1][i]-num[0][i]<<' ';
cout<<num[1][9]-num[0][9]<<endl;
return 0;
}
1833: [ZJOI2010]count 数字计数——数位dp的更多相关文章
- BZOJ 1833 ZJOI2010 count 数字计数 数位DP
题目大意:求[a,b]间全部的整数中0~9每一个数字出现了几次 令f[i]为i位数(算前导零)中每一个数出现的次数(一定是同样的,所以仅仅记录一个即可了) 有f[i]=f[i-1]*10+10^(i- ...
- bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)
1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...
- [bzoj1833][ZJOI2010]count 数字计数——数位dp
题目: (传送门)[http://www.lydsy.com/JudgeOnline/problem.php?id=1833] 题解: 第一次接触数位dp,真的是恶心. 首先翻阅了很多很多一维dp,因 ...
- bzoj1833: [ZJOI2010]count 数字计数 数位dp
bzoj1833 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. O ...
- BZOJ 1833: [ZJOI2010]count 数字计数( dp )
dp(i, j, k)表示共i位, 最高位是j, 数字k出现次数. 预处理出来. 差分答案, 对于0~x的答案, 从低位到高位进行讨论 -------------------------------- ...
- 【BZOJ-1833】count数字计数 数位DP
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 2494 Solved: 1101[Submit][ ...
- 1833: [ZJOI2010]count 数字计数
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 2951 Solved: 1307[Submit][ ...
- [BZOJ 1833] [ZJOI2010] count 数字计数 【数位DP】
题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i ...
- 【BZOJ】1833: [ZJOI2010] count 数字计数(数位dp)
题目 传送门:QWQ 分析 蒟蒻不会数位dp,又是现学的 用$ dp[i][j][k] $ 表示表示长度为i开头j的所有数字中k的个数 然后预处理出这个数组,再计算答案 代码 #include < ...
随机推荐
- jQuery全选反选实例
1. $('#tb:checkbox').each(function(){ 每次都会执行 全选-取消操作,注意$('#tb :checkbox').prop('checked',true); tb后面 ...
- css的存在形式及优先级
1. 查看源代码---在谷歌浏览器中右击-->点检查 2. CSS中style优先级,标签上的style优先,其它按照编写顺序越更新越优先,后面的会把前面的覆盖掉. 3. 如果想在其它的html ...
- 转:DP和HDP
Dirichlet Process and Hierarchical Dirichlet Process 原文:http://hi.baidu.com/zentopus/item/46a622f5ef ...
- 【以前的空间】bzoj 1227 [SDOI2009]虔诚的墓主人
题解:hzw大神的博客说的很清楚嘛 http://hzwer.com/1941.html 朴素的做法就是每个点如果它不是墓地那么就可形成十字架的数量就是这个c(点左边的树的数量,k)*c(点右边的树的 ...
- [NOIP2012]疫情控制 贪心 二分
题面:[NOIP2012]疫情控制 题解: 大体思路很好想,但是有个细节很难想QAQ 首先要求最大时间最小,这种一般都是二分,于是我们二分一个时间,得到一个log. 然后发现一个军队,越往上走肯定可以 ...
- bzoj 1150&2151&2288(双向链表+堆)(贪心)
经典模型:在n个点中选k个点,要求两两不相邻,且总权值最大/最小. 做法:用双向链表串起来,把所有点丢进堆里,选择一个点的时候把它左右两个点从双向链表和堆中去除,然后把这个点的权值加进ans,出堆后改 ...
- php 获取客户端IP地址经纬度所在城市
1. [代码]获取客户端IP地址经纬度所在城市 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 <?php $getIp=$_SERVER["REMOTE_ADDR ...
- ReentrantLock和synchronized区别和联系?
相同:ReentrantLock提供了synchronized类似的功能和内存语义,都是可重入锁. 不同: 1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此 ...
- ubuntu启动脚本
下午分析了一下mysql的启动脚本,找到这篇,记录一下,目前很多服务都是以这种方式封装,后面自己写来借鉴一下 http://blog.fens.me/linux-upstart/
- MySQL5.5安装图解
MySQL5.5安装图解... ====================== 第一部分:去官网下载MySQL安装包... MySQL下载官网:https://dev.mysql.com/downloa ...