记录编号 |
468644 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[ZJOI 2010] 数字统计 |
最终得分 |
100 |
用户昵称 |
BaDBoY |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.000 s |
提交时间 |
2017-11-01 16:43:03 |
内存使用 |
0.00 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long long l,r,bit[15],f[15],c[15],p[15];
long long dfs(int pos,int pre,int Dig,bool Limit) {
if(pos<=0) return 0;
if(pre>=0&&!Limit&&f[pos]!=-1) return f[pos];
int End=Limit?bit[pos]:9;
long long ans=0;
for(int i=0; i<=End; ++i) {
if(pre<0&&!i) ans+=dfs(pos-1,pre,Dig,Limit&&i==End);
else if(i==Dig) {
if(i==End&&Limit) ans+=c[pos-1]+1+dfs(pos-1,i,Dig,Limit&&i==End);
else ans+=p[pos-1]+dfs(pos-1,i,Dig,Limit&&i==End);
} else ans+=dfs(pos-1,i,Dig,Limit&&i==End);
} if(pre>=0&&!Limit) f[pos]=ans;
return ans;
}
long long Get(long long x,int dig) {
memset(f,0xff,sizeof(f));
memset(bit,0,sizeof(bit));
while(x) bit[++bit[0]]=x%10,x/=10,c[bit[0]]=c[bit[0]-1]+bit[bit[0]]*p[bit[0]-1];
return dfs(bit[0],-10,dig,true);
}
bool Main() {
freopen("countzj.in","r",stdin);
freopen("countzj.out","w",stdout);
scanf("%lld%lld",&l,&r); --l;
p[0]=1; for(int i=1; i<15; ++i) p[i]=p[i-1]*10;
for(int i=0; i<=9; ++i) printf("%lld ",Get(r,i)-Get(l,i));
return 0;
}
bool hehe=Main();
int main(){;}