D:数位小孩
题意 | 简单
给定一个区间 [l , r l,rl,r] ,求这个区间内有多少个数字满足以下条件:
每相邻两个数位和为素数
其中至少一个数位为1
没有前导零
0 ≤ \leq≤ l , r l,rl,r ≤ \leq≤ 1 0 10 10^{10}10
10
思路 | 暴力
因为数据范围不大,可以直接写一个dfs进行暴力寻找,把哪些数字可以相邻在一起的先预处理出来,然后就暴力开找就行啦
代码
#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int maxn = 1e6 + 100;
typedef long long ll;
ll prime[1006];
bool sf[2006];
void sushu() {
ll num = 0;
memset(sf, true, sizeof(sf));
sf[1] = false;
sf[0] = false;
for (int i = 2; i < 1000; i++) {
if (sf[i]) prime[++num] = i;
for (int j = 1; j <= num; j++) {
if (i * prime[j] > 1000) break;
sf[i * prime[j]] = false;
if (i % prime[j] == 0) break;
}
}
}
int l, r;
int ans1 = 0; int ans2 = 0;
vectorg[100];
void dfs(int x,int sum,int f) {
if (sum < l) {
if (f == 1) ans1++;
}
else return;
for (int i = 0; i < g[x].size(); i++) {
int to = g[x][i];
if (to == 1) dfs(to, sum * 10 + to, 1);
else dfs(to, sum * 10 + to, f);
}
}
void dfs2(int x, int sum,int f) {
if (sum <= r) {
if (f == 1) ans2++;
}
else return;
for (int i = 0; i < g[x].size(); i++) {
int to = g[x][i];
if (to == 1) dfs2(to, sum * 10 + to, 1);
else dfs2(to, sum * 10 + to, f);
}
}
void solve() {
for (int i = 0; i <= 9; i++) {
for (int j = 0; j <= 9; j++) {
if (sf[i + j])g[i].push_back(j);
}
}
cin >> l >> r;
for (int i = 1; i <= 9; i++) {
if (i == 1) {
dfs(i, i, 1);
dfs2(i, i, 1);
}
else {
dfs(i, i, 0);
dfs2(i, i, 0);
}
}
cout << ans2 - ans1 << endl;
}
signed main() {
int t; t = 1;
sushu();
while (t--) {
solve();
}
return 0;
}