POJ2282 The Counting Problem
题意
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 5070 | Accepted: 2590 |
Description
1024 1025 1026 1027 1028 1029 1030 1031 1032
there are ten 0's in the list, ten 1's, seven 2's, three 3's, and etc.
Input
Output
Sample Input
1 10
44 497
346 542
1199 1748
1496 1403
1004 503
1714 190
1317 854
1976 494
1001 1960
0 0
Sample Output
1 2 1 1 1 1 1 1 1 1
85 185 185 185 190 96 96 96 95 93
40 40 40 93 136 82 40 40 40 40
115 666 215 215 214 205 205 154 105 106
16 113 19 20 114 20 20 19 19 16
107 105 100 101 101 197 200 200 200 200
413 1133 503 503 503 502 502 417 402 412
196 512 186 104 87 93 97 97 142 196
398 1375 398 398 405 499 499 495 488 471
294 1256 296 296 296 296 287 286 286 247
Source
求出区间内0~9的个数
分析
参照hncu__lz的题解。
建立f(k)和f(10*k+x)的关系,也就是说对于一个大数,先处理到末尾为0,然后再认为是从0开始10个10个数数到这个数。例如,f(2984)就先从2981数到2984(2,9,8各出现4次,1,2,3,4一次)然后f(2980)可以和f(298)建立递推(实际的时候用f(297)更好一点)。注意这里需要建立一个“乘子”,一开始为1,每次递推一层就*10,然后累加到0-9的记录上。
比较巧妙的一个统计转移,详见代码。我发现要找出这类计数问题的步骤含义的最好方法就是模拟一遍。
时间复杂度\(O(\lg n)\)
代码
#include<iostream>
#include<cstring>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
using namespace std;
void dfs(int n,int*f,int x){
if(n<=0) return;
int w=n%10+1;
for(int i=1;i<w;++i) f[i]+=x; //不从0开始是方便下面第3个for循环
for(int z=n/10;z;z/=10) f[z%10]+=w*x; //尾数 0到d 对应有多少高位
for(int i=0;i<=9;++i) f[i]+=n/10*x; // [0,n/10) 其中末尾为0的特殊分配到n/10
dfs(n/10-1,f,x*10);
}
int main(){
for(int x,y;read(x)|read(y);){
static int a[10],b[10];
memset(a,0,sizeof a),memset(b,0,sizeof b);
if(x>y) swap(x,y);
if(--x<y) dfs(y,b,1),dfs(x,a,1);
for(int i=0;i<9;++i) printf("%d ",b[i]-a[i]);
printf("%d\n",b[9]-a[9]);
}
return 0;
}
POJ2282 The Counting Problem的更多相关文章
- POJ2282 The Counting Problem(数位DP)
用dp[pos][val][cnt]表示状态,pos是数位,val是当前统计的数字,cnt是目前统计的目标数字的出现次数 注意状态的转移过程,统计数字0时前导0的影响. 1 #include<c ...
- UVA 1640 The Counting Problem UVA1640 求[a,b]或者[b,a]区间内0~9在里面各个数的数位上出现的总次数。
/** 题目:UVA 1640 The Counting Problem UVA1640 链接:https://vjudge.net/problem/UVA-1640 题意:求[a,b]或者[b,a] ...
- 『The Counting Problem 数位dp』
The Counting Problem Description 求 [L,R]内每个数码出现的次数. Input Format 若干行,一行两个正整数 L 和 R. 最后一行 L=R=0,表示输入结 ...
- The Counting Problem
The Counting Problem 询问区间\([a,b]\)中\(1\sim 9\)出现的次数,0 < a, b < 100000000. 解 显然为数位递推,考虑试填法,现在关键 ...
- POJ2282:The Counting Problem(数位DP)
Description Given two integers a and b, we write the numbers between a and b, inclusive, in a list. ...
- UVa 1640 - The Counting Problem(数论)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1640 The Counting Problem
https://vjudge.net/problem/UVA-1640 题意:统计区间[l,r]中0——9的出现次数 数位DP 注意删除前导0 #include<cmath> #inclu ...
- [POJ 2282] The Counting Problem
[题目链接] http://poj.org/problem?id=2282 [算法] 数位DP [代码] #include <algorithm> #include <bitset& ...
- UVa 1640 (计数) The Counting Problem
题意: 统计[a, b]或[b, a]中0~9这些数字各出现多少次. 分析: 这道题可以和UVa 11361比较来看. 同样是利用这样一个“模板”,进行区间的分块,加速运算. 因为这里没有前导0,所以 ...
随机推荐
- 微信小程序访问豆瓣电影api400错误解决方法
最近在跟着demo学习微信小程序,却卡在了第一步请求豆瓣电影api上,折腾了很久,代码如下: wx.request({ url : "https://api.douban.com/v2/mo ...
- Hive学习(2)
什么是hive Hive是基于Hadoop的一个数据仓库工具(E抽取T转换L加载),可以将结构化的数据文件映射为一张表,并提供类SQL查询功能 hive的处理流程 ()将HQL语句转化为一组操作符 ( ...
- 通过Anaconda安装的jupyter notebook,打开时,未能启动默认浏览器
问题:通过Anaconda安装的jupyter notebook,通过开始菜单的快捷方式打开时,未能启动网页,需要复制url,粘贴到浏览器中才会出现工作面板. 解决方法: 修改jupyter_note ...
- 使用eslint检查代码质量
1.安装 全局安装 npm install eslint -g 局部安装 npm install eslint --save 2.初始化一个配置文件 eslint --init 执行后根据项目需要回答 ...
- IdentityServer4实现OAuth2.0四种模式之授权码模式
接上一篇:IdentityServer4实现OAuth2.0四种模式之隐藏模式 授权码模式隐藏码模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token ...
- [jsp学习笔记] jsp基础知识 数据初始化、同步
- 3.建造模式(Builder)
注:图片来源于 https://www.cnblogs.com/-saligia-/p/10216752.html 建造模式UML图解析: 代码: Director.h // // Created b ...
- Jenkins多环境持续集成架构实践
自动化部署主要是为了解决项目多.环境多.持续集成慢.部署操作麻烦.手动操作易出错.自动化运维等问题. Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建.部署.自动化 ...
- UCOSIII内建消息队列
使能内建消息队列 将OS_CFG_TASK_Q_EN置1 API函数 #if OS_CFG_TASK_Q_EN > 0u //删除 OS_MSG_QTY OSTaskQFlush (OS_TCB ...
- 中兴软开C++面经(一站式西安)- 2019秋招
大概是9.6发短信邀请面试,但是6号有三个面试+一个在线笔试,就打算先去平安产险,看中途能不能再面个云从,中兴后面再面.然而,平安等了差不多4个小时才面完,期间云从面试官打来电话,只能说抱歉.中兴本来 ...