题意:给一个数n,你要求出所有满足条件的n位数。条件为,比如abcdef这6位数,必须满足,a,ab,abc,abcd,abcde,abcdef都为素数。
直接dfs,每增加一个数判断是否为素数。
因为唯一分解定理,所以我们只需算出最大数maxn的sqrt(maxn)内的素数,就能快速判断一个素是否为素数。
/**
TASK: sprime
LANG: C++
ID: DickensTone
**/
#include<cstdio>
#include<cstring>
const int maxn = 10000 + 5;
unsigned int prime[maxn];
bool vis[maxn];
int cnt;
void get_prime()
{
memset(vis, 0, sizeof(vis));
cnt = 0;
for(int i = 2; i < maxn; i++)
{
if(!vis[i])
{
prime[cnt++] = i;
int t = i;
while(t < maxn)
{
vis[t] = 1;
t = t + i;
}
}
}
}
bool is_prime(int n)
{
for(int i = 0; i < cnt && prime[i] < n; i++)
{
if(n % prime[i] == 0) return false;
}
return true;
}
void dfs(int num, int deep)
{
if(!is_prime(num)) return;
if(deep == 1)
{
printf("%d\n", num);
return;
}
num = num * 10;
for(int i = 1; i <= 9; i = i + 2)
dfs(num + i, deep - 1);
}
int main()
{
freopen("sprime.in", "r", stdin);
freopen("sprime.out", "w", stdout);
get_prime();
int n;
while(scanf("%d", &n) == 1)
{
for(int i = 0; i < 4; i++)
dfs(prime[i], n);
}
return 0;
}