【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

请你编写程序帮他该题

image-20220213150751602image-20220213150803127

思想

本题可以用数位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;
}
posted @ 2022-02-13 15:19  blockche  阅读(32)  评论(0编辑  收藏  举报