博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ZJOI2010]数字计数
阅读量:4931 次
发布时间:2019-06-11

本文共 1463 字,大约阅读时间需要 4 分钟。

题目描述

给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。

输入输出格式

输入格式:

 

输入文件中仅包含一行两个整数a、b,含义如上所述。

 

输出格式:

 

输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。

 

输入输出样例

输入样例#1:
1 99
输出样例#1:
9 20 20 20 20 20 20 20 20 20

说明

30%的数据中,a<=b<=10^6;

100%的数据中,a<=b<=10^12。

 

数位DP

 

#include
#include
#include
#include
using namespace std;int a[14];long long bit[14],dp[14][14],ans[10];long long dfs(int dep,int ty,bool lim,int k){ if(!dep) return ty; if(!lim && dp[dep][ty]!=-1) return dp[dep][ty]; long long ans=0; int up= lim ? a[dep] : 9; for(int i=0;i<=up;i++) { if(i==k) ans+=dfs(dep-1,ty+1,lim && i==up,k); else ans+=dfs(dep-1,ty,lim && i==up,k); } if(!lim) dp[dep][ty]=ans; return ans;}int main(){ long long l,r; bit[1]=10; for(int i=2;i<=13;i++) bit[i]=bit[i-1]*10; scanf("%lld%lld",&l,&r); while(r) a[++a[0]]=r%10,r/=10; for(int i=0;i<=9;i++) { memset(dp,-1,sizeof(dp)); ans[i]=dfs(a[0],0,1,i); } l--; if(!l) ans[0]--; int tmp=a[0]; a[0]=0; while(l) a[++a[0]]=l%10,l/=10; for(int i=0;i<=9;i++) { memset(dp,-1,sizeof(dp)); ans[i]-=dfs(a[0],0,1,i); } while(tmp!=a[0]) ans[0]-=bit[--tmp]; printf("%lld",ans[0]); for(int i=1;i<=9;i++) printf(" %lld",ans[i]);}

 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/7410492.html

你可能感兴趣的文章
Quartz Core之CALayer
查看>>
MySQL表行数查询最佳实践
查看>>
win10下安装psql9,后无法访问数据库引擎
查看>>
潭州课堂25班:Ph201805201 爬虫基础 第一课 (课堂笔记)
查看>>
mysql utf8_bin跟utf8_general_ci的区别
查看>>
linux编辑器 vi的使用
查看>>
真正可用的Asdoc生成工具及技巧和注意事项
查看>>
什么时候能相信人
查看>>
运算符和表达式
查看>>
html页面中块级元素的居中
查看>>
简练网软考知识点整理-采购工作说明书SOW
查看>>
易忘小技巧--yum
查看>>
springboot环境中,可能会出现使用font-Awesome结果图标不显示的问题,在webService的pom文件中添加如下配置代码...
查看>>
BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)
查看>>
BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)
查看>>
部署-云服务器-运维
查看>>
字符串处理的两个小技巧
查看>>
GoLand配置数据库、远程host以及远程调试
查看>>
第一周学习进度条
查看>>
java:一个项目的开发过程(转)
查看>>