USACO 1.5.3 Superprime Rib

题意:

       求出给定长度为N的数,使得满足这个数从右边开始一位一位的切掉,剩下的数全部是质数

解法:

       一开始想按照顺序枚举,发现预处理质数的时间就已经很复杂了(最大长度为8,[0, 100000000]),

果断搜爆了

      看了一下解法提示,一位一位的进行搜索,剪枝条件(第一位数只能是2,3,5,7)其余位数只能是(1,3,5,7,9)

质数条件的限制,然后进行搜索即可,此时判断质数复杂度大为降低,比前一种思路减少了大量的运行时间,所以不能想得

太简单,USACO的题目都是很有质量的

 

    

/*
ID: lsswxr1
PROG: sprime
LANG: C++
*/
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;

#define USACO
#ifdef USACO
#define cin fin
#define cout fout
#endif
//////////////////////////////////////////////////////////////////////////
///宏定义
const int  INF = 1000000000;
const int MAXN = 10251;
const int maxn = MAXN;
///全局变量 和 函数

#ifdef USACO    
    ofstream fout ("sprime.out");
    ifstream fin ("sprime.in");
#endif   

int N;
int farray[4] = {2, 3, 5, 7};
int arrays[5] = {1, 3, 5, 7, 9};
inline bool isPrime(int cur)
{
    for (int i = 2; i <= sqrt(double(cur)); i++)
    {
        if (cur % i == 0)
            return false;
    }
    return true;
}

void dfs(int num, int level)
{
    if (!isPrime(num))
    {
        return;
    }
    if (level == N)
    {
        cout << num << endl;
    }

    if (level == 0)
    {
        for (int i = 0; i < 4; i++)
        {
            dfs(farray[i], 1);
        }
    }
    else
    {
        for (int i = 0; i < 5; i++)
        {
            dfs(num * 10 + arrays[i], level + 1);
        }
    }
}


int main()
{


    
    while (cin >> N)
    {
        dfs(0, 0);
    }

    ///结束
    return 0;
}

 

 

posted on 2013-12-26 22:05  小书包_Ray  阅读(170)  评论(0编辑  收藏  举报

导航