解决的问题为:
定义 # 数字,对于一个没有前导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;
}