/*
ID: m1590291
TASK: sprime
LANG: C++
*/
#include <iostream>
#include <fstream>
using namespace std;
/******************************************************************************************************************
第一次感到 DFS 是如此的好用和方便
思路: (从数学的角度)
1.首位只能是质数2 3 5 7
2.其余位只能是1,3,7,9
3.若n=1,直接输出2,3,5 7
4. DFS 不需要预处理。 直接DFS 1~9,加入当前数末尾,并判断是不是素数,
是则递归处理下一位数,不是则回溯,直到depth>n。不会超时。
******************************************************************************************************************/
ifstream fin("sprime.in");
ofstream fout("sprime.out");
int N;
int fuc(int x)
{
for(int i = 2;i*i <= x;i ++)
if(x%i == 0) return 0;
return 1;
}
void dfs(int x,int num)
{
if(!fuc(x)) return ; //不是质数,进行回溯
if(num == N) fout<<x<<endl; //边界条件,长度 num == N;
else{
for(int i = 1;i <=9;i +=2)
dfs(x*10+i,num+1);
}
}
int main()
{
while(fin>>N)
{
int a[4]={2,3,5,7};
for(int i = 0;i < 4;i ++){
dfs(a[i],1);
}
}
return 0;
}
USACO 1.5-Superprime Rib
最新推荐文章于 2017-10-15 21:11:50 发布