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;
}

posted @ 2025-10-23 10:30  bz02_2023f2  阅读(4)  评论(0)    收藏  举报  来源