您的位置:首页 > 其它

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。其技巧主要在于判定以及输出空格、回车符上。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: