DP26题
DP好题单,你值得拥有
O-Matching
状压DP。
S-Digit Sum
数位DP:前置芝士
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int d;
string k;
int f[10005][105][2];
//当前处理位数&当前数字模数&当前数字是否与k的前缀相同
int num[10005];
int dfs(int nt,int m,int st){
if(nt>k.length()) return (m==0);
if(f[nt][m][st]>-1) return f[nt][m][st];
// printf("%d %d %d\n",nt,m,st);
int cnt=0,mx=9;
if(st) mx=num[nt];
for(int i=0;i<=mx;++i)
(cnt+=dfs(nt+1,(m+i)%d,st&&(i==mx)))%=mod;
return f[nt][m][st]=cnt;
}
int main(){
cin>>k;
scanf("%d",&d);
memset(f,-1,sizeof(f));
for(int i=0;i<k.length();++i)
num[i+1]=int(k[i]-'0');
printf("%d",((dfs(1,0,1)-1)%mod+mod)%mod);
return 0;
}

浙公网安备 33010602011771号