bzoj 1833: [ZJOI2010]count 数位dp
题目:
给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。
题解
设\(f[i][j]\)表示长度为\(i\)的所有合法数字中有多少数码\(j\)
设\(g[i][j]\)表示长度为\(i\)的可有前导零的数字中有多少数码\(j\)
然后恶心不想说了.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(ll &x){
x=0;static char ch;static bool flag;flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
const int maxn = 22;
ll f[maxn][maxn],g[maxn][maxn];
int a[maxn],cnt;
inline void init(int n){
rep(i,0,9){
g[1][i] = 1;
if(i) f[1][i] = 1;
}
ll pw = 1;
rep(i,2,n){
pw *= 10;
rep(j,0,9){
g[i][j] = 10*g[i-1][j] + pw;
f[i][j] = 9*g[i-1][j];
if(j != 0) f[i][j] += pw;
}
}
}
ll solve(ll n,int x){
if(n == 0) return 0;
int cnt = 0;
ll ans = 0;
static int a[maxn];
while(n){
a[++cnt] = n % 10;
if(a[cnt] == x) ++ ans;
n /= 10;
}
ll pw = 1;
rep(i,1,cnt) pw *= 10;
ll tmp = 0;
per(i,cnt,1){
pw /= 10;
ans += tmp*a[i]*pw;
if(i == cnt){
ans += (a[i] - 1)*g[i-1][x];
if(x && x < a[i]) ans += pw;
}else{
ans += a[i]*g[i-1][x];
if(x < a[i]) ans += pw;
}
if(a[i] == x) ++ tmp;
}
rep(i,1,cnt-1) ans += f[i][x];
return ans;
}
int main(){
init(13);
ll l,r;read(l);read(r);
rep(i,0,9){
printf("%lld",solve(r,i) - solve(l-1,i));
if(i != 9) putchar(' ');
else putchar('\n');
}
return 0;
}
bzoj 1833: [ZJOI2010]count 数位dp的更多相关文章
- [BZOJ 1833] [ZJOI2010] count 数字计数 【数位DP】
题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i ...
- BZOJ 1833: [ZJOI2010]count 数字计数( dp )
dp(i, j, k)表示共i位, 最高位是j, 数字k出现次数. 预处理出来. 差分答案, 对于0~x的答案, 从低位到高位进行讨论 -------------------------------- ...
- bzoj 1833: [ZJOI2010]count 数字计数【数位dp】
非典型数位dp 先预处理出f[i][j][k]表示从后往前第i位为j时k的个数,然后把答案转换为ans(r)-ans(l-1),用预处理出的f数组dp出f即可(可能也不是dp吧--) #include ...
- BZOJ 1833: [ZJOI2010]count 数字计数
Description 问 \([L,R]\) 中0-9的个数. Sol 数位DP. 预处理好长度为 \(i\), 最高位为 \(j\) 的数位之和. 然后从上往下计算,不要忘记往下走的同时要把高位的 ...
- BZOJ 1833 数字计数 数位DP
题目链接 做的第一道数位DP题,听说是最基础的模板题,但还是花了好长时间才写出来..... 想深入了解下数位DP的请点这里 先设dp数组dp[i][j][k]表示数位是i,以j开头的数k出现的次数 有 ...
- bzoj 1833 [ZJOI2010]count 数字计数(数位DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1833 [题意] 统计[a,b]区间内各数位出现的次数. [思路] 设f[i][j][k ...
- BZOJ 1833 ZJOI2010 count 数字计数 数位DP
题目大意:求[a,b]间全部的整数中0~9每一个数字出现了几次 令f[i]为i位数(算前导零)中每一个数出现的次数(一定是同样的,所以仅仅记录一个即可了) 有f[i]=f[i-1]*10+10^(i- ...
- [bzoj1833][ZJOI2010][count] (数位dp)
Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文 ...
- 1833: [ZJOI2010]count 数字计数
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 2951 Solved: 1307[Submit][ ...
随机推荐
- 图片剪裁控件——ClipImageView
这段时间在做自己的项目时,须要使用到图片剪裁功能,当时大概的思考了一些需求.想到了比較简单的实现方法.因此就抽了点时间做了这个图片剪裁控件--ClipImageView 这里先贴上ClipImageV ...
- 1. lvs+keepalived 高可用群集
一. keepalived 工具介绍 1.专为lvs 和HA 设计的一款健康检查工具 2.支持故障自动切换 3.支持节点健康状态检查 二. keepalived 实现原理剖析 keepalived ...
- idangerous swiper
最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,欢迎指出,多谢! 翻译自:http://www.idangero.us/sliders/swiper/api.ph ...
- vs重复编译
VS用了这么久都没有这样的问题,昨天突然发现在自己电脑时间不对了,就调了下,以后这问题都来了.每次运行项目都要重新编译下,不管改不改底层代码.这让我很痛苦,浪费大量时间,找了好久才得到答案: .时间问 ...
- NumPy入门基础【2】
通用函数ufunc 一元ufunc举例: 1.abs.fabs:计算绝对值,fabs更快 2.sqrt:计算各元素的平方根,相当于arr0.5 3.square:计算各元素的平方根,相当远arr2 4 ...
- flex (html弹性布局)
flex是什么? 任何容器都可以指定为flex布局: .box{ display: flex; /* 行内元素可以使用:inline-flex,webket内核浏览器必须 -webkit-flex ...
- 洛谷 P2486 [SDOI2011]染色
题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案. 输入输出样例 输入样例#1: 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C ...
- 3.06课·········C#语言基础
Main函数: static void Main(string [] args){ }程序代码需要写在Main函数的花括号内. 一.输出:Console.WriteLine("这是我的第一个 ...
- 数据库基本表创建 完整性约束 foreign Key
理解以下几张表的内容,根据实际情况设计属性名.数据类型.及各种完整性约束(primary key.foreign key.not null.unique.check),用数据定义语言实现,然后设计实验 ...
- Centos7 配置yum源 安装epel
一.什么是epel如果既想获得 RHEL 的高质量.高性能.高可靠性,又需要方便易用(关键是免费)的软件包更新功能,那么 Fedora Project 推出的 EPEL(Extra Packages ...