记录编号 468644 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2010] 数字统计 最终得分 100
用户昵称 GravatarBaDBoY 是否通过 通过
代码语言 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(){;}