标签:搜索
思路
虽然这个题乍一看数据范围挺大,但实际上区间中满足条件的数并不多,是dfs可以接受的范围,因为其前两个条件已经限定了很多,当某相邻两数位和不是素数时,那么包含这两个数位的数都不会去搜索
搜索的实现设置了三个变量,分别存目前构造的数,上一位的数,以及目前是否至少有一个数位为1,当构造的数在给定的范围且至少有一个数位为1时答案加1
而第三个条件,没有前导0,可以通过最外层循环从1到9开始实现
还要注意的是,题目中1算是一个合法的答案,但是10不是,所以当两个相邻数位和为1时应当判断为不合法
代码实现
#include<stdio.h>
#include<iostream>
using namespace std;
long long l,r;
int ans;
bool check(long long x){
if(x == 1 || x == 0) return false; //1和0都不是素数
for(int i = 2; i * i <= x; i++){
if(x % i == 0) return false;
}
return true;
}
void dfs(long long now, int last, int flag){
if(now > r) return;
if(now >= l && flag) ans++;
for(int i = 0; i <= 9; i++){
if(check(i+last)){
if(!flag && i != 1) dfs(now*10+i, i, 0);//如果之前构造的数中没有一个数位为1且当前填入的数也不为1
else dfs(now*10+i, i, 1);
}
}
}
int main(){
cin >> l>> r;
for(int i = 1; i <= 9; i++){
if(i == 1) dfs(i, i, 1); //如果i=1,说明已经有一个数位为1,这时flag为1
else dfs(i, i, 0); //否则flag为0
}
cout<<ans;
return 0;
}