USACO Section1.5 Superprime Rib 解题报告
2015-03-09 21:10
411 查看
sprime解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
列出所有N位的超级素数。
所谓超级素数,即指其任意位前缀均为素数。例如7、73、733、7331均为素数,故而7331为超级素数。
【数据范围】
1<=N<=8
【输入样例】
4
【输出样例】
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
逐位枚举+筛法+试除法。
这道题需要逐位枚举,具体过程描述如下:
1.定义0位的素数只有0(为了编程方便),调用函数go(0,0);
2.函数go(k,x)主体:x是k位的超级素数,枚举y=x*10+i(i=0~9),由筛法所得数组判断,若y为超级素数则调用go(k+1,y);
3.函数go(k,x)边界:当k==N时,输出x并return;
4.函数go(k,x)特判(置于边界判断后):当k==7&&N==8时,枚举y=x*10+i(i=0~9),由试除法判断,若y为超级素数则调用go(k+1,y);
值得一提的是,这里的特判可以大大提高运行效率,大约从2s缩减到0.2s,性价比很高。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
又是同样的问题,好奇怪!为什么100,000,000过不了?求解答啊!
我的处理方法是:令max=10,000,000,对于N==8的情况,在枚举到第8位的时候采用试除法判素数。这样便可以过了。
不过这样的处理倒是很不错的,因为这样一来筛法的时间变成了十分之一,而到8位可枚举的数已经少之又少,所以程序的运行效率提高极为显著。原来代码运行时间是2s+,现在只有不到0.2s了。学习了!
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
列出所有N位的超级素数。
所谓超级素数,即指其任意位前缀均为素数。例如7、73、733、7331均为素数,故而7331为超级素数。
【数据范围】
1<=N<=8
【输入样例】
4
【输出样例】
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
逐位枚举+筛法+试除法。
这道题需要逐位枚举,具体过程描述如下:
1.定义0位的素数只有0(为了编程方便),调用函数go(0,0);
2.函数go(k,x)主体:x是k位的超级素数,枚举y=x*10+i(i=0~9),由筛法所得数组判断,若y为超级素数则调用go(k+1,y);
3.函数go(k,x)边界:当k==N时,输出x并return;
4.函数go(k,x)特判(置于边界判断后):当k==7&&N==8时,枚举y=x*10+i(i=0~9),由试除法判断,若y为超级素数则调用go(k+1,y);
值得一提的是,这里的特判可以大大提高运行效率,大约从2s缩减到0.2s,性价比很高。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
又是同样的问题,好奇怪!为什么100,000,000过不了?求解答啊!
我的处理方法是:令max=10,000,000,对于N==8的情况,在枚举到第8位的时候采用试除法判素数。这样便可以过了。
不过这样的处理倒是很不错的,因为这样一来筛法的时间变成了十分之一,而到8位可枚举的数已经少之又少,所以程序的运行效率提高极为显著。原来代码运行时间是2s+,现在只有不到0.2s了。学习了!
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
/* ID: icedrea1 PROB: sprime LANG: C++ */ #include <iostream> #include <fstream> #include <cmath> using namespace std; const int maxd = 10000000; bool d[1+maxd]; int N; bool isPrime(int x) { for(int i=2;i<=sqrt(x);++i) if(x%i==0) return false; return true; } void go(int k,int x,ofstream &out) { if(k==N) { out<<x<<endl; return; } x*=10; if(N==8 && k==7) { for(int i=0;i<=9;++i) if(isPrime(x+i)) go(k+1,x+i,out); return; } for(int i=0;i<=9;++i) if(!d[x+i]) go(k+1,x+i,out); } int main() { ifstream in("sprime.in"); ofstream out("sprime.out"); d[0]=d[1]=true; for(int i=1;i<=10000;++i) if(!d[i]) for(int j=i+i;j<=maxd;j+=i) d[j]=true; in>>N; go(0,0,out); in.close(); out.close(); return 0; }
相关文章推荐
- USACO Section 1.5 Superprime Rib 解题报告
- USACO-Section1.5 Superprime Rib
- USACO-Section1.5 SuperPrime Rib [质数]
- USACO-section1.5 Superprime Rib[深搜]
- USACO Section 1.5 Superprime Rib - 构造数列
- USACO - Chapter1 Section 1.5 - Superprime Rib
- USACO Section1.5 Number Triangles 解题报告
- USACO Section1.5 Prime Palindromes 解题报告
- USACO-Section1.5 Superprime Rib【深度优先搜索】
- 洛谷P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib
- USACO 1.5-Superprime Rib
- USACO Section2.3 Zero Sum 解题报告 【icedream61】
- USACO Section 1.2 Dual Palindromes 解题报告
- USACO Section1.2 Dual Palindromes 解题报告
- USACO Section2.3 Money Systems 解题报告 【icedream61】
- [USACO1.5]特殊的质数肋骨 Superprime Rib-洛谷 1218
- USACO Section 1.2 Name That Number 解题报告
- USACO Section 1.1 Your Ride Is Here 解题报告
- 【洛谷 1218】[USACO1.5]特殊的质数肋骨 Superprime Rib
- USACO Section2.3 Longest Prefix 解题报告 【icedream61】