不知道为什么,最后一个测试点错了
//Code by HackerZhuYifan who enjoys coding.
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
const int inf=1e18;
const int mod=1e9+7;
const int maxk=1e4+10,maxd=1e2+10;
//main code:
void update(int &x,int y){
x=((x%mod+y%mod)%mod+mod)%mod;;
return;
}
string s;
vector<int> num;
int n,d,dp[maxk][maxd][3];
main(){
cin >> s >> d;
num.push_back(inf);
for(int i=s.size()-1;i>=0;i--){
num.push_back(s[i]-'0');
}
n=num.size()-1;
dp[0][0][1]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<d;j++){
for(int k=0;k<num[i];k++){
update(dp[i][j][0],dp[i-1][(j-k%d+d)%d][0]);
update(dp[i][j][0],dp[i-1][(j-k%d+d)%d][1]);
update(dp[i][j][0],dp[i-1][(j-k%d+d)%d][2]);
}
update(dp[i][j][0],dp[i-1][(j-num[i]%d+d)%d][0]);
update(dp[i][j][1],dp[i-1][(j-num[i]%d+d)%d][1]);
update(dp[i][j][2],dp[i-1][(j-num[i]%d+d)%d][2]);
for(int k=num[i]+1;k<=9;k++){
update(dp[i][j][2],dp[i-1][(j-k%d+d)%d][0]);
update(dp[i][j][2],dp[i-1][(j-k%d+d)%d][1]);
update(dp[i][j][2],dp[i-1][(j-k%d+d)%d][2]);
}
}
}
int ans=-1;
update(ans,dp[n][0][0]);
update(ans,dp[n][0][1]);
cout << ans << endl;
return 0;
}