你们别看n<=8
其实它代表的是10^8
我先不用筛法
以下是六十分代码(#4#5TLE)
#include <bits/stdc++.h>
const int Max=1e8;
bool flag[Max];
int cur=1;
int a[Max];
void shai()//欧拉筛
{
memset(flag,1,sizeof(flag));
flag[0]=flag[1]=0;
for(int i=2;i<=1e8;i++)
{
if(flag[i])
{
a[cur]=i;
cur++;
}
for (int j=1;j<cur&&i*a[j]<=1e8;j++)
{
flag[a[j]*i]=0;
if (i%a[j]==0) break;
}
}
}
bool pr1(int j)
{
if(j<=1)
{
return 0;
}
for(int i=2;i*i<=j;i++)
{
if(j%i==0)
{
return 0;
}
}
return 1;
}
bool pr2(int i)
{
return flag[i];
}
bool pd(int d)
{
while(d>0)
{
if(!pr1(d))
{
return 0;
}
d-=(d%10);
d/=10;
}
return 1;
}
int main()
{
int N;
scanf("%d",&N);
int shi=pow(10,N-1);
int end=pow(10,N)-1;
for(int i=shi;i<=end;i++)
{
if(pd(i))
{
printf("%d\n",i);//不敢用cout
}
}
return 0;
}
以下是用欧拉筛80分代码(最后一点TLE)
#include <bits/stdc++.h>
const int Max=1e8;
bool flag[Max];
int cur=1;
int a[Max];
void shai()//欧拉筛
{
memset(flag,1,sizeof(flag));
flag[0]=flag[1]=0;
for(int i=2;i<=1e8;i++)
{
if(flag[i])
{
a[cur]=i;
cur++;
}
for (int j=1;j<cur&&i*a[j]<=1e8;j++)
{
flag[a[j]*i]=0;
if (i%a[j]==0) break;
}
}
}
bool pr1(int j)
{
if(j<=1)
{
return 0;
}
for(int i=2;i*i<=j;i++)
{
if(j%i==0)
{
return 0;
}
}
return 1;
}
bool pr2(int i)
{
return flag[i];
}
bool pd(int d)
{
while(d>0)
{
if(!pr2(d))
{
return 0;
}
d-=(d%10);
d/=10;
}
return 1;
}
int main()
{
shai();
int N;
scanf("%d",&N);
int shi=pow(10,N-1);
int end=pow(10,N)-1;
for(int i=shi;i<=end;i++)
{
if(pd(i))
{
printf("%d\n",i);//不敢用cout
}
}
return 0;
}
欧拉筛都会超时 更不用说埃筛了 求优化!