记录编号 |
85636 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[UVa 11361] 数字和与倍数 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}