csp模拟题代码,求大佬注释
  • 板块学术版
  • 楼主qilian_mountain
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/8/17 21:22
  • 上次更新2024/8/18 08:58:44
查看原帖
csp模拟题代码,求大佬注释
718762
qilian_mountain楼主2024/8/17 21:22

解决的问题为: 定义 # 数字,对于一个没有前导0的数,数字d恰好出现在这个数的所有偶数位置。
现在给定m,d,a,b,询问[a,b]范围内是m倍数的 # 数字的数量,答案对1e9+7取模。
我无法理解该程序如何执行,固求教(原题填空题,空已按答案补全)。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int M = 2005;
const int mod = 1e9 + 7;
int dp[M][M][2];
int m, d;
int dfs(int i, int sum, int small_taken, string& s)
{
	if (i >= s.size())
		return sum == 0;
	int ans = dp[i][sum][small_taken];
	if (ans != -1)
		return ans;
	ans = 0;
	int digit = s[i] - '0';
	int low = 0, high = digit;
	if (small_taken)
		high = 9;
	for (int j = low; j < high; ++j)
	{
		if (i % 2 == 1 && j != d)
			continue;
		if (i % 2 == 0 && j == d)
			continue;
		int new_small = small_taken && j < high;
		int new_sum = (sum + high) % m;
		ans += dfs(i + 1, new_sum, new_small, s);
		ans %= mod;
	}
	return dp[i][sum][small_taken] = ans;
}
int main()
{
	string a, b;
	cin >> m >> d >> a >> b;
	int is_a_magic = 1;
	int res = 0;
	for (int i = 0; i < a.size(); ++i)
	{
		int dig = a[i] - '0';
		if (i % 2 == 0 && dig == d)
			is_a_magic = 0;
		if (i % 2 == 1 && dig != d)
			res = (res * 10 + dig) % m;
	}
	if (res)
		is_a_magic = 0;
	memset(dp, -1, sizeof(dp));
	int sum_a = dfs(0, 0, 0, a);
	memset(dp, -1, sizeof(dp));
	int sum_b = dfs(0, 0, 0, b);
	cout << (sum_b - sum_a + is_a_magic + mod) % mod;
	return 0;
}
2024/8/17 21:22
加载中...