【bzoj1833】 ZJOI2010—count 数字计数
http://www.lydsy.com/JudgeOnline/problem.php?id=1833 (题目链接)
题意
求在${[a,b]}$范围内整数中,每个数码出现的次数。
Solution
数位dp。
${t}$数组取到最大数时表示每一位是多少。
${f[i][j][k]}$表示第${i}$位,这一位上的数为${j}$,数字${k}$的出现次数。转移:$${f[i][j][k]=\sum_{l=0}^9f[i-1][l][k]+10^(i-1)}$$
${g[i][k]}$表示第${i}$位,这一位上的数取到最大时数字${k}$的出现次数。转移:$${g[i][k]=\sum_{j=0}^{t[i-1]-1}f[i-1][j][k]+g[i-1][k]}$$
当然,如果${g[i][t[i]]}$还要再加上${t[i]}$对方案的贡献。
细节
感觉细节还是蛮多的,还是不够熟练啊
代码
// bzoj1833
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
#define LL long long
#define inf (1ll<<30)
#define MOD 1000000007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; LL a[2],t[20],f[20][10][10],g[20][10],ans[10];
int n; void solve(int p) {
memset(f,0,sizeof(f));memset(g,0,sizeof(g));
for (n=0;a[p];a[p]/=10) t[++n]=a[p]%10;
for (int i=0;i<10;i++) f[1][i][i]=1;
LL bin=1,bb=0;
g[1][t[1]]=1;
for (int i=2;i<=n;i++) {
bb+=bin*t[i-1],bin*=10;
for (int j=0;j<10;j++) {
for (int k=0;k<10;k++)
for (int l=0;l<10;l++) f[i][j][k]+=f[i-1][l][k];
f[i][j][j]+=bin;
}
for (int k=0;k<10;k++) {
g[i][k]=g[i-1][k];
for (int j=0;j<t[i-1];j++) g[i][k]+=f[i-1][j][k];
}
g[i][t[i]]+=bb+1;
}
int q=p ? 1 : -1;
for (int i=1;i<n;i++)
for (int j=1;j<10;j++)
for (int k=0;k<10;k++)
ans[k]+=f[i][j][k]*q;
for (int j=1;j<t[n];j++)
for (int k=0;k<10;k++)
ans[k]+=f[n][j][k]*q;
for (int k=0;k<10;k++)
ans[k]+=g[n][k]*q;
}
int main() {
scanf("%lld%lld",&a[0],&a[1]);a[0]--;
solve(0);solve(1);
for (int i=0;i<10;i++) {
printf("%lld",ans[i]);
if (i<9) printf(" ");
}
return 0;
}
【bzoj1833】 ZJOI2010—count 数字计数的更多相关文章
- [BZOJ1833][ZJOI2010]count 数字计数
[BZOJ1833][ZJOI2010]count 数字计数 试题描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入 输入文件中仅包含一行两个整数a ...
- BZOJ1833 ZJOI2010 count 数字计数 【数位DP】
BZOJ1833 ZJOI2010 count 数字计数 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包 ...
- bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)
1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...
- [BZOJ1833][ZJOI2010]Count数字计数(DP)
数位DP学傻了,怎么写最后都写不下去了. 这题严格上来说应该不属于数位DP?只是普通DP加上一些统计上的判断吧. 首先复杂度只与数的位数$\omega$有关,所以怎么挥霍都不会超. f[i][j][k ...
- bzoj1833: [ZJOI2010]count 数字计数 数位dp
bzoj1833 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. O ...
- bzoj1833: [ZJOI2010]count 数字计数 && codevs1359 数字计数
bzoj1833 codevs1359 这道题也是道数位dp 因为0有前导0这一说卡了很久 最后发现用所有位数减1~9的位数就okay.....orzczl大爷 其他就跟51nod那道统计1出现次数一 ...
- [bzoj1833][ZJOI2010]count 数字计数——数位dp
题目: (传送门)[http://www.lydsy.com/JudgeOnline/problem.php?id=1833] 题解: 第一次接触数位dp,真的是恶心. 首先翻阅了很多很多一维dp,因 ...
- BZOJ1833 [ZJOI2010]count 数字计数 【数学 Or 数位dp】
题目 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中仅包含一行两个整数a.b,含义如上所述. 输出格式 输出文件中包含一行10个整数, ...
- bzoj1833: [ZJOI2010]count 数字计数&&USACO37 Cow Queueing 数数的梦(数位DP)
难受啊,怎么又遇到我不会的题了(捂脸) 如题,这是一道数位DP,随便找了个博客居然就是我们大YZ的……果然nb,然后就是改改模版++注释就好的了,直接看注释吧,就是用1~B - 1~A-1而已,枚举全 ...
- 【数位dp】bzoj1833: [ZJOI2010]count 数字计数
数位dp姿势一直很差啊:顺便庆祝一下1A Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a ...
随机推荐
- zookeeper简易配置及hadoop高可用安装
zookeeper介绍 是一个分布式服务的协调服务,集群半数以上可用(一般配置为奇数台), 快速选举机制:当集群中leader挂掉,所有小弟会投票选举出新的leader. ...
- 【python 2.7】获取外部参数
import sys res_0 = sys.argv[0] res_1 = sys.argv[1] res_2 = sys.argv[2] print res_0 print res_1 print ...
- awk之close函数
echo "21 2 " | awk '{ first[NR]=$ second[NR]=$ }END{ print "======打印第1列并排序:========== ...
- java并发编程原理
一.java内存模型 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节.此处的变量与Java编程时所说的变量不一样,指包括了实例字段 ...
- Python之并发编程-多线程
目录 一.threading模块介绍二.使用说明三.进一步介绍(守护线程,锁(互斥锁.递归锁),信号量,队列,event,condition,定时器) 1.守护线程 2.锁(互斥锁.递归锁) 3.信号 ...
- 模块-Memcached、Redis
目录 Mecache 安装 使用 Redis 安装 Python操作Redis 操作模式 连接池 操作 String Hash List Set sort set 其他常用操作 管道 发布订阅 sen ...
- YQCB绩效表
标准 队员 工作质量 20% 工作态度 20% 工作量 30% 工作难易程度 20% 团队意识 10% 总分 陈美琪 17 18 28 19 9 91 张晨阳 16 16 25 17 9 83 刘昭为 ...
- NetFPGA-SUME下reference_nic测试
Reference_nic Reference_nic是NetFPGA-SUME中提供的一个参考Demo,本文主要介绍如何构建并在SUME上运行reference_nic. GIT源 git clon ...
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char ...
- 二叉查找树ADT--C语言描述
首先给出此ADT的声明: struct TreeNode; typedef struct TreeNode *Position; typedef struct TreeNode *SearchTree ...