AT_dp_s Digit Sum题解
题目描述
在 1 到 K 之间的整数中,有多少个整数满足其十进制表示的各位数字之和是 D 的倍数?请输出答案对 109+7 取模后的结果。
输入格式
输入以以下格式从标准输入中给出。
K D
输出格式
请输出满足条件的整数个数,对 109+7 取模后的结果。
显示翻译
题意翻译
输入输出样例
输入 #1复制
30 4
输出 #1复制
6
输入 #2复制
1000000009 1
输出 #2复制
2
输入 #3复制
98765432109876543210 58
输出 #3复制
635270834
说明/提示
限制条件
- 输入均为整数。
- 1≤K<1010000
- 1≤D≤100
样例解释 1
有 6 个数分别为 4, 8, 13, 17, 22, 26。
样例解释 2
请不要忘记将答案对 109+7 取模后输出。
由 ChatGPT 4.1 翻译
思路
数位DP。
代码见下
#include<bits/stdc++.h>
using namespace std;
char ch[10005];
long long n,d,ss,a[10005],f[10005][105][2],mod=1e9+7;
long long abc(long long a1,long long b1,long long c1){
if(a1==0){
if(b1==0) return 1;
else return 0;
}
if(f[a1][b1][c1]!=-1) return f[a1][b1][c1];
f[a1][b1][c1]=0;
//cout<<a1<<" "<<b1<<" "<<c1<<" "<<a[a1]<<endl;
if(c1==1){
for(int i=0;i<=a[a1];i++){
if(i!=a[a1]){
f[a1][b1][c1]+=abc(a1-1,(b1+i)%d,0);
//cout<<abc(a1-1,(b1+i)%d,0)<<endl;
}
else{
f[a1][b1][c1]+=abc(a1-1,(b1+i)%d,1);
//cout<<abc(a1-1,(b1+i)%d,1)<<endl;
}
}
}
else{
for(int i=0;i<=9;i++){
f[a1][b1][c1]+=abc(a1-1,(b1+i)%d,0);
//cout<<abc(a1-1,(b1+i)%d,0)<<endl;
}
}
f[a1][b1][c1]%=mod;
return f[a1][b1][c1];
}
int main(){
cin>>ch;
size_t ff=strlen(ch);
ss=ff;
cin>>d;
for(int i=ss-1;i>=0;i--){
a[++n]=(long long)(ch[i]-'0');
}
memset(f,-1,sizeof(f));
cout<<(abc(n,0,1)+mod-1)%mod<<endl;
return 0;
}

浙公网安备 33010602011771号