【DFS】2022牛客寒假集训5 D-数位小孩
D - 数位小孩
题目来源:2022牛客寒假算法基础集训营5
题目链接:D-数位小孩_2022牛客寒假算法基础集训营5 (nowcoder.com)
题目
九峰最近沉迷数位dp,这天他又造了个数位dp题:
给出一个区间[l,r][l,r][l,r],求这个区间内有多少个数字满足如下条件:
1.每相邻两个数位和为素数
2.其中至少一个数位为1
3.没有前导0
请你编写程序帮他该题
思想
本题可以用数位dp做(但我是蒟蒻,我不会数位dp),因为此题数据量较小,只有不到25个数位,所以可以用DFS来暴力求解。
利用的是素数环的思想。
注意
1、题目要求至少有一个数位为1,于是用到了一个 f标记 和 或的性质,当至少出现过一次1的时候,f为1。
代码
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
#define SF ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
const int inf = 0x3f3f3f3f;
int pr[30];
vector<ll> ans;
ll l, r, cnt;
void dfs(ll x, ll f) {
if (x > r) return;
if (f) ans.push_back(x);
ll past = x % 10;
for (int i = 0; i <= 9; ++i) {
if (pr[past + i]) {
dfs(x * 10 + i, f | (i == 1));
}
}
}
int main() {
SF;
cin >> l >> r;
pr[2] = pr[3] = pr[5] = pr[7] = pr[11] = pr[13] = pr[17] = pr[19] = 1;
for (int i = 1; i <= 9; ++i) {
dfs(i, i == 1);
}
ll num = 0;
for (auto x : ans) {
if (x >= l) num++;
}
cout << num << endl;
return 0;
}