P6371 [COCI2006-2007#6] V 题解
一个比较有趣的数位 DP。
考虑当
对于
有一点需要注意,如果
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
const int LIM = 1e4;
const int N = 13;
long long x, a, b;
string s;
bool flag[N];
long long solve1()
{
for (auto& i : s) flag[i - '0'] = 1;
long long ans = 0LL;
for (long long i = x; i <= b; i += x)
{
if (i < a) continue;
string ss = to_string(i);
for (auto& i : ss)
{
if (!flag[i - '0'])
{
goto E;
}
}
ans++;
E:;
}
return ans;
}
long long dp[N][LIM + 5][2][2];
string p;
long long dfs(int u, long long r, bool flag, bool zgw)
{
if (~dp[u][r][flag][zgw]) return dp[u][r][flag][zgw];
dp[u][r][flag][zgw] = 0;
if (r == 0 && u == p.size())
{
if (!flag)
{
dp[u][r][flag][zgw] = 1;
}
}
if (u > p.size() - 1) return dp[u][r][flag][zgw];
int nowlim = (zgw ? p[u] - '0' : 9);
for (auto& i : s)
{
int gg = i - '0';
if (gg <= nowlim)
{
dp[u][r][flag][zgw] += dfs(u + 1, (r * 10LL + gg) % x, (flag && gg == 0), (zgw && gg == nowlim));
}
}
if (flag && s.find("0") == -1)
{
dp[u][r][flag][zgw] += dfs(u + 1, 0LL, 1, 0);
}
return dp[u][r][flag][zgw];
}
long long solve2()
{
p = to_string(b);
p = " " + p;
memset(dp, -1, sizeof dp);
long long ans1 = dfs(1, 0, 1, 1);
p.clear();
p = to_string(a - 1);
p = " " + p;
memset(dp, -1, sizeof dp);
long long ans2 = dfs(1, 0, 1, 1);
return ans1 - ans2;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
cin >> x >> a >> b >> s;
if (x > LIM) cout << solve1() << "\n";
else cout << solve2() << "\n";
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话