玄关求调
查看原帖
玄关求调
1032391
封禁用户楼主2025/6/14 09:49

为啥样例三一直过不了啊?
即使没有算 a - 1,也不应该差这么多啊?

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e3 + 5 , mod = 1e9 + 7;
int dp[2005][11] , m , d , num[2005] , top;
int dfs(int n , int x , int y , int tag) {
	if(x < 1) return !y;
	if(~dp[x][y] && !tag) return dp[x][y];
	int h = 0;
	for(int i = 0 ; i <= (tag ? num[x] : 9) ; i ++)
		if((n - x + 1) & 1 && i != d) {
			h = (h + dfs(n , x - 1 , (y * 10 + i) % m , tag && (i == num[x]))) % mod;
		} else if(i == d) {
			h = (h + dfs(n , x - 1 , (y * 10 + i) % m , tag && (i == num[x]))) % mod;
		}
	if(!tag) dp[x][y] = h;
	return h;
}
int solve(string x) {
	int len = x.size();
	for(int i = 0 ; i < len ; i ++) num[len - i] = x[i] - '0';
	return dfs(len , len , 0 , 1);
}
signed main() {
	memset(dp , -1 , sizeof(dp));
	string l , r;
	cin>>m>>d>>l>>r;
	cout<<(solve(r) - solve(l) + mod) % mod<<'\n';
	for(int i = 1 ; i <= r.size() + 1 ; i ++) {
		for(int j = 0 ; j < 10 ; j ++)
			cout<<dp[i][j]<<' ';
		cout<<'\n';
	}
	return 0;
}

2025/6/14 09:49
加载中...