BZOJ 1833 count 数字计数 数位DP
2017-06-09 16:52
453 查看
【Description】
给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。
【Input】
输入文件中仅包含一行两个整数a、b,含义如上所述。
【Output】
输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。
【解题报告】
这道题很容易看出是一个数位dp。其技巧主要在于判定以及输出空格、回车符上。
给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。
【Input】
输入文件中仅包含一行两个整数a、b,含义如上所述。
【Output】
输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。
【解题报告】
这道题很容易看出是一个数位dp。其技巧主要在于判定以及输出空格、回车符上。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long a,b; long long ans[10],f[20]; void res(long long x,long long pos) { while(x) ans[x%10]+=pos,x/=10; } void dp(long long x,int flag) { long long pos,now; int i,j; for(i=1,pos=10;pos<x;++i,pos*=10) { for(j=0;j<=9;j++) ans[j]+=f[i-1]*9*flag; for(j=1;j<=9;j++) ans[j]+=pos/10*flag; } now=pos/=10;--i; while(now<x) { while(now+pos<=x) { long long temp=now/pos; res(temp,pos*flag); for(j=0;j<=9;j++) ans[j]+=f[i]*flag; now+=pos; } pos/=10;--i; } } int main() { long long pos; int i,j; f[1]=1; for(i=2,pos=10;i<=12;i++,pos*=10) f[i]=f[i-1]*10+pos; scanf("%lld%lld",&a,&b); dp(b+1,1); dp(a,-1); for(j=0;j<=9;j++) printf("%lld%c",ans[j],j==9?'\n':' '); return 0; }
相关文章推荐
- bzoj 1833: [ZJOI2010]count 数字计数(数位dp)
- Bzoj1833:[ZJOI2010]count 数字计数:数位dp
- bzoj 1833: [ZJOI2010]count 数字计数【数位dp】
- 【BZOJ1833】【ZJOI2010】count 数字计数 (数位DP)
- [bzoj1833][ZJOI2010]count 数字计数——数位dp
- [BZOJ1833] [ZJOI2010]count 数字计数 && 数位DP
- [bzoj 1833] [ZJOI2010]count 数字计数:数位DP
- BZOJ 1833: [ZJOI2010]count 数字计数 [数位DP]
- BZOJ 1833: [ZJOI2010]count 数字计数 数位DP,处理前导0
- 【bzoj1833】[ZJOI2010]count 数字计数 数位DP
- 【BZOJ1833】【数位DP】 count 数字计数
- BZOJ1833 [ZJOI2010]count 数字计数 【数学 Or 数位dp】
- bzoj1833: [ZJOI2010]count 数字计数 数位dp
- BZOJ 1833 [ZJOI2010]count 数字计数(数位dp)
- [省选前题目整理][BZOJ 1833][ZJOI 2010]count 数字计数(数位DP)
- BZOJ 1833 ZJOI2010 count 数字计数 数位DP
- bzoj1833: [ZJOI2010]count 数字计数(数位dp)
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)
- 【BZOJ 1833】 [ZJOI2010]count 数字计数|数位DP
- BZOJ 1833 count 数字计数 (数位DP)