【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;
}