记录编号 236017 评测结果 AAAAAAAAAA
题目名称 [AHOI 2009] 同类分布 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 5.779 s
提交时间 2016-03-12 10:59:12 内存使用 10.18 MiB
显示代码纯文本
#define ll long long

#define maxd 20ul
#define maxn 180ul

#include <stdio.h>
#include <string.h>

ll f[2][maxd][maxn][maxn];

int gel(ll n){
	ll ans=0;
	while(n) n/=10,ans++;
	return ans;
}

int getnum(ll n,int p){
	for(ll i=1;i<p;i++) n/=10;
	return n%10;
}

void dp(int sum,int len,ll n){
	f[0][0][sum][0]=1;
	for(int i=0;i<len;i++){
        ll nx=getnum(n,len-i);
		for(int j=0;j<=sum;j++) for(int k=0;k<sum;k++){
			if(f[0][i][j][k]){
				ll tmp=f[0][i][j][k];
				if(j==sum){
					f[0][i+1][j][k]+=tmp;
					if(!i){
						for(int r=1;r<nx;r++) if(j>=r) f[1][i+1][j-r][(k*10+r)%sum]+=tmp;
						if(j>=nx) f[0][i+1][j-nx][(k*10+nx)%sum]+=tmp;
					}
					else{
						for(int r=1;r<10;r++) if(j>=r) f[1][i+1][j-r][(k*10+r)%sum]+=tmp;
					}
				}
				else{
	                for(int r=0;r<nx;r++) if(j>=r) f[1][i+1][j-r][(k*10+r)%sum]+=tmp;
	                if(j>=nx) f[0][i+1][j-nx][(k*10+nx)%sum]+=tmp;
				}
			}
			if(f[1][i][j][k]){
				ll tmp=f[1][i][j][k];
				for(int r=0;r<10;r++) if(j>=r) f[1][i+1][j-r][(k*10+r)%sum]+=tmp;
			}
		}
	}
	return;
}

ll work(ll n){
	if(!n) return 0;
	ll ans=0,len=gel(n);
	for(int i=1,t=9*len;i<=t;i++){
		memset(f,0,sizeof(f)),dp(i,len,n);
		ans+=f[0][len][0][0]+f[1][len][0][0];
	}
	return ans;
}

int main(){
	freopen("self.in","r",stdin);
	freopen("self.out","w",stdout);
	ll l,r;
	scanf("%lld%lld",&l,&r);
	printf("%lld\n",work(r)-work(l-1));
	return 0;
}