usaco1.5.3(sprime)
2012-07-17 22:01
246 查看
题目:由于今晚usaco崩溃了,所以补贴题目了。大意是给一个N(1<=N<=8),从小到大输出所有满足条件的N位数。
条件:1,此N位数是素数。2,此N位数前面的都是素数。
例如:三位数233,是素数,去掉最后一位3,剩余23依然是素数,再去掉一位,剩余2还是素数。
看到题目感觉是dp,后面的由前面的添加转化而来,但是在想办法存储前面时出现了问题,不知道怎么下笔。最后直接用8个if暴力过掉了。后来看解题报告,根本无需记录,直接用递归算就行了,表示还是太嫩了,没经验。
代码:这么丑陋的代码不看也罢
看完解题报告,感到无比汗颜,直接递归写,不用存储N-1位,代码估计只有40行左右。
今早起来,回想了官方结题报告的过程,自己用dp思路是这写了下,过了:
代码:
条件:1,此N位数是素数。2,此N位数前面的都是素数。
例如:三位数233,是素数,去掉最后一位3,剩余23依然是素数,再去掉一位,剩余2还是素数。
看到题目感觉是dp,后面的由前面的添加转化而来,但是在想办法存储前面时出现了问题,不知道怎么下笔。最后直接用8个if暴力过掉了。后来看解题报告,根本无需记录,直接用递归算就行了,表示还是太嫩了,没经验。
代码:这么丑陋的代码不看也罢
看完解题报告,感到无比汗颜,直接递归写,不用存储N-1位,代码估计只有40行左右。
今早起来,回想了官方结题报告的过程,自己用dp思路是这写了下,过了:
代码:
/* ID:614433244 PROG: sprime LANG: C++ */ #include"iostream" #include"cstdio" #include"cmath" using namespace std; bool isp( int t ) { if( t==2 ) return true; if( t==3 ) return true; if( t>3 ) { int i; for( i=3;i<=sqrt(t)+1;i+=2 ) if( t%i==0 ) return false; return true; } } void f( int n,int k ) { if( k==1&&isp(n) ) { printf("%d\n",n); return; } else { n=n*10; if( isp( n+1 ) ) f( n+1,k-1 ); if( isp(n+3) ) f( n+3,k-1 ); if( isp( n+7 ) ) f( n+7,k-1 ); if( isp(n+9) ) f( n+9,k-1 ); } } int main() { freopen("sprime.in","r",stdin); freopen("sprime.out","w",stdout); int n; scanf("%d",&n); f( 2,n ); f(3,n); f(5,n); f(7,n); return 0; }
相关文章推荐
- usaco 1.5.3 sprime
- USACO 1.5.3 sprime ———— 暴枚 || DFS
- usaco 1.5.3 sprime
- usaco 1.5.3 sprime
- USACO1.5.3 SuperPrime Rib (sprime)
- USACO1.5.3 SuperPrime Rib (sprime)
- usaco 1.5.3
- USACO:1.5.3 Superprime Rib 特殊的质数肋骨
- USACO-Section1.5 sprime[深搜]
- usaco-sprime-superprime-pass
- 【USACO1.5.3】特殊的质数肋骨
- [USACO 1.5.3]特殊的质数肋骨
- USACO:1.5.3 Superprime Rib
- usaco——sprime
- Usaco 1.5.3 特殊的质数肋骨(特殊的质数肋骨)
- 【USACO 1.5.3】特殊的质数肋骨
- usaco 1.5 sprime 2008.11.5
- [USACO 1.5.3]特殊的质数肋骨
- USACO:1.5.3 Superprime Rib 特殊的质数肋骨
- USACO sprime