bzoj 1833 [ZJOI2010]count 数字计数(数位DP)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=1833
【题意】
统计[a,b]区间内各数位出现的次数。
【思路】
设f[i][j][k]表示i位数,最高位为j,数位k出现的次数,则有递推式:
f[i][j][k]=sigma{ f[i-1][l][k] ,0<=l<=9 } + 10^(i-1)
第一项统计的是i-1位数中k的出现次数,后一项统计的是最高位k的出现数目。
将查询差分,对于一个数,先统计长度不超过len的,再统计长度=len但最高位比a[len]小的,再统计长度为len且最高位为a[len]的。
注意最后一项的统计,假设n为4321,我们要统计的就是:
4000..4299
4300..4319
4320..4321
假设我们要统计4000..4299,则有;
ans[k]+=f[3][3][k]
ans[4]+=321+1
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=b;a<=c;a++)
using namespace std; typedef long long ll;
const int N = ; struct Node{
ll a[N];
Node() {
memset(a,,sizeof(a));
}
ll& operator[] (const int& x) {
return a[x];
}
};
Node operator + (const Node& x,const Node& y) {
Node tmp;
FOR(i,,) tmp.a[i]=x.a[i]+y.a[i];
return tmp;
} int len,a[N];
ll e[N]; Node f[N][N]; void init(ll n)
{
len=;
while(n) {
a[++len]=n%;
n/=;
}
FOR(i,,) f[][i][i]=;
FOR(i,,) FOR(j,,) {
FOR(k,,)
f[i][j]=f[i][j]+f[i-][k];
f[i][j][j]+=e[i-];
}
}
Node calc(ll n)
{
Node ans;
if(!n) return ans;
memset(f,,sizeof(f));
init(n);
FOR(i,,len-) FOR(j,,)
ans=ans+f[i][j];
FOR(i,,a[len]-) ans=ans+f[len][i];
n%=e[len-];
ans[a[len]]+=n+;
for(int i=len-;i;i--) {
for(int j=;j<a[i];j++) ans=ans+f[i][j];
n%=e[i-];
ans[a[i]]+=n+;
}
return ans;
} int main()
{
e[]=;
FOR(i,,) e[i]=e[i-]*10ll;
ll x,y;
scanf("%lld%lld",&x,&y);
Node ans1=calc(y) , ans2=calc(x-);
FOR(i,,) printf("%lld ",ans1[i]-ans2[i]);
printf("%lld\n",ans1[]-ans2[]);
return ;
}
bzoj 1833 [ZJOI2010]count 数字计数(数位DP)的更多相关文章
- BZOJ 1833 ZJOI2010 count 数字计数 数位DP
题目大意:求[a,b]间全部的整数中0~9每一个数字出现了几次 令f[i]为i位数(算前导零)中每一个数出现的次数(一定是同样的,所以仅仅记录一个即可了) 有f[i]=f[i-1]*10+10^(i- ...
- 1833: [ZJOI2010]count 数字计数——数位dp
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1833 省选之前来切一道裸的数位dp.. 题意 统计[a,b]中0~9每个数字出现的次数(不算 ...
- BZOJ 1833: [ZJOI2010]count 数字计数( dp )
dp(i, j, k)表示共i位, 最高位是j, 数字k出现次数. 预处理出来. 差分答案, 对于0~x的答案, 从低位到高位进行讨论 -------------------------------- ...
- 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,因 ...
- [BZOJ 1833] [ZJOI2010] count 数字计数 【数位DP】
题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i ...
- 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\) 的数位之和. 然后从上往下计算,不要忘记往下走的同时要把高位的 ...
- bzoj1833: [ZJOI2010]count 数字计数 数位dp
bzoj1833 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. O ...
随机推荐
- Recommender Systems 基于知识的推荐
前两章的协同过滤和就内容的推荐都建立在“大量数据”的基础上,运用概率方法来进行计算和预测.不过,在现实生活中,有些物品,如:汽车.房屋.计算机,用户不会频繁的消费.如何在这种情况下对用户进行推荐? 这 ...
- [转载]介绍一个JSONP 跨域访问代理API-yahooapis
你是否遇到了想利用AJAX访问一些公网API,但是你又不想建立自己的代理服务,因为有时我根本就没打算涉及服务端任何代码,但是讨厌的浏览器的同源策略,阻止了我们的ajax调用. 比如我想访问一个天气的r ...
- uva 1377
比较不错的一个题,关键是理解状态转移 #include<algorithm> #include<cstdio> #include<cstring> #include ...
- linux 5.5 开xmanager远程
http://bbs.cqsztech.com/dv_rss.asp?s=xhtml&boardid=3&id=11&page=9 linux 5.5 开xmanager远程 ...
- UIcollectionView的使用(首页的搭建2)
2.2 直接购买的UIcollectionCell 2.2.1创建CFPromptBuyCell,继承自UICollectionViewCell,定义了标题和图片两个属性 2.2.2 在.m文件中定义 ...
- xml格式化
Vim怎么格式化xml,完全不会,vim的缩进也搞不明白
- 简单的神经元算法实现(python)
参考python代码如下 #perceptron x=[[1 ,0, 0],[1,0,1],[1, 1, 0],[1, 1, 1],[0,0,1],[0,1,0],[0,1,1],[0,0,0]] y ...
- hdu4619Warm up 2
http://acm.hdu.edu.cn/showproblem.php?pid=4619 二分图匹配 最小点覆盖 = 最大匹配 #include <iostream> #includ ...
- 函数buf_LRU_get_free_block
/******************************************************************//** Returns a free block from th ...
- [原]Unity3D深入浅出 - GUI控件
Unity的GUI类提供了丰富的界面控件,通过组合这些控件,完成和用户交互的界面. Lable:绘制文本和图片 Box:绘制一个图形框 Button:绘制一个响应单击事件的按钮 RepeatButto ...