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;
}
posted @ 2022-02-21 17:58  Star_LIcsAy  阅读(68)  评论(0)    收藏  举报