错误代码
思路与蓝书(是这么叫吗?)相同吧
我感觉它的公式打错了一点点,所以我就写的不一样
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int t,a,b,k,dp[15][105][105][5],c[15],f[15];
int dfs(int d,int m1,int m2,bool fl){
if(d==0) return m1==0&&m2==0;
if(dp[d][m1][m2][fl]) return dp[d][m1][m2][fl];
int num=9,ret=0;
if(fl) num=c[d];
for(int i=0;i<=num;i++)
ret+=dfs(d-1,((m1-i)%k+k)%k,((m2-i*f[d-1])%k+k)%k,i==num&&fl);
dp[d][m1][m2][fl]=ret;
return ret;
}
int solve(int x){
memset(dp,0,sizeof(dp));
int len=0;
for(len=1;x;len++){
c[len]=x%10;
x/=10;
}//倒序的
return dfs(len,0,0,1);
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&a,&b,&k);
f[0]=1;
for(int i=1;i<=10;i++)
f[i]=(f[i-1]*10%k+k)%k;
if(k>=100) printf("0\n");
else printf("%d\n",solve(b)-solve(a-1));
}
return 0;
}
我是不是复杂度假掉了/dk