#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e8+10;
int prime[maxn];
bool isprime[maxn];
long long ans = 0;
int fk[4] = {2,3,5,7};
void Prime(){
memset(isprime,1,sizeof(isprime));
isprime[0] = isprime[1] = 0;
for(int i=2;i<=maxn;i++){
if(isprime[i]){
prime[++ans] = i;
}
for(int j=1;j<=ans&&i*prime[j]<=maxn;j++){
long long temp = (long long)i*prime[j];
isprime[temp] = 0;
if(i%prime[j]==0) break;
}
}
}
int main(){
int n;
scanf("%d",&n);
Prime();
for(int k=0;k<4;k++){
for(int i=fk[k]*pow(10,n-1);i<=(fk[k]+1)*pow(10,n-1);i++){
int temp = i;
while(isprime[temp]){
temp/=10;
}
if(temp==0) printf("%d\n",i);
}
}
return 0;
}
具体思路:首先是欧拉筛预处理,fk数组的意义:第一位数字只能是2,3,5,7,所以可以跳着判断。while循环是判断:例如temp=7331时,temp/10(也就是733)继续判断是否符合条件,直到temp为0时输出正确结果。
#4,#5 TLE 的数据点应该是n=7和n=8的时候,这个代码不知道还能不能再优化一下过#4,#5呢?(实在想不到还能怎么优化了)