记录编号 85636 评测结果 AAAAAAAAAA
题目名称 [UVa 11361] 数字和与倍数 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 1.090 s
提交时间 2014-01-08 22:40:21 内存使用 1.16 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<iomanip>
using namespace std;
typedef long long ll;
const ll SIZEM=100,SIZED=11;
ll MOD;
ll f[SIZED][SIZEM][SIZEM]={0};
ll pw10[11]={1};
inline ll getdig(ll x){return (ll)floor((log10(double(x))+1));}
inline ll getmod(ll x){return ((x%MOD)+MOD)%MOD;}
ll DP(ll d,ll m1,ll m2){
	ll &ans=f[d][m1][m2];
	if(ans>=0) return ans;
	if(d==0) return (m1==0&&m2==0)?(ans=1):(ans=0);
	ans=0;
	for(ll x=0;x<=9;x++) ans+=DP(d-1,getmod(m1-x),getmod(m2-pw10[d-1]*x));
	return ans;
}
ll psum(ll x){//小于x且满足条件的数
	ll nd=getdig(x),i,j,now=0,ans=0,m1=0,m2=0;
	for(i=nd-1;i>=0;i--){
		for(j=1;now+j*pw10[i]<=x;j++){
			ans+=DP(i,getmod(m1-(j-1)),getmod(m2-(j-1)*pw10[i]));
		}
		j--;
		now+=pw10[i]*j;
		m1=getmod(m1-j),m2=getmod(m2-j*pw10[i]);
	}
	return ans;
}

int main(){
	freopen("divsum.in","r",stdin);
	freopen("divsum.out","w",stdout);
	for(ll i=1;i<=10;i++) pw10[i]=(pw10[i-1]*10);
	ll T,a,b;
	scanf("%lld",&T);
	while(T--){
		memset(f,-1,sizeof(f));
		scanf("%lld%lld%lld",&a,&b,&MOD);
		if(MOD>85){
			printf("%d\n",0);
			continue;
		}
		printf("%lld\n",psum(b+1)-psum(a));
	}
	return 0;
}