usaco.section1.5 && 2.1
2015-11-13 09:04
344 查看
(section1.5) SuperPrime Rib
找出
N
位的特殊质数,如 7331 就是一个特殊质数,因为 7331
是质数,733 是质数,73 和
7 也是质数,按升序输出
算法1:通过打表观察, 1 位的质数只有 2,3,5,7,而后面的只能在末尾添加 1,3,7,9这几个数。所以我们先确定 1 位的,然后 DFS 后面的,每次
O( sqrt(n) ) 判断一下是不是质数就行了。因为这样的特殊质数很多少,所以不会超时。
算法2:i
位的特殊质数只能通过 i - 1 位的在末尾加上 1,3,7,9 得到,而这个是没有后效性的,可以 DP。设
F[ i ][ size[ i ] ] 代表 i 位的特殊质数,size[ i ]
代表个数那么 F[ i + 1][ size[ i + 1 ] ] = F[ i ][ size[ i ] ] * 10 + a[ i ],a[ i ]
就等于 1,3,7,9,其中还需要判断一下 F[ i ][ size[ i ] ] * 10 + a[ i ] 是不是质数,老方法。
// code I ----------------------------------------------------------------- #include <cstdio> using namespace std; int N, a[5] = {0, 1, 3, 7, 9}; inline bool isprime(int x) // check the prime { for (int i=2; i*i<=x; i++) if (x % i == 0) return 0; return 1; } void dfs(int num, int len) { if (len > N) return; //bigger than we wanted if (len == N) { printf("%d\n", num); return; } //equal to we wanted for (int i=1; i<=4; i++) if (isprime(num * 10 + a[i])) dfs(num * 10 + a[i], len + 1); } int main(void) { freopen ("sprime.in", "r", stdin); freopen ("sprime.out", "w", stdout); scanf("%d", &N); dfs(2, 1); dfs(3, 1); dfs(5, 1); dfs(7, 1); return 0; } // code II ----------------------------------------------------------------- #include <cstdio> using namespace std; int N, a[5] = {0, 1, 3, 7, 9}; int f[9][50], size[50]; inline bool isprime(int x) { for (int i=2; i*i<=x; i++) if(x % i == 0) return 0; return 1; } int main() { freopen ("sprime.in", "r", stdin); freopen ("sprime.out", "w", stdout); scanf("%d", &N); f[1][1] = 2; f[1][2] = 3; f[1][3] = 5; f[1][4] = 7; size[1] = 4; for (int i=2; i<=N; i ++){ for (int j=1; j<=size[i-1]; j++) for (int k=1; k<=4; k++) if(isprime(f[i-1][j] * 10 + a[k])) f[i][++ size[i]] = f[i-1][j] * 10 + a[k]; } for (int i=1; i<=size ; i++) printf("%d\n", f [i]); return 0; }
( section2.1 ) Ordered Fractions
找出分母小于等于 N 的最简分数,按升序输出这道题似乎不用写题解吧
#include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 165; struct node{ int x, y; }a[MAX_N * MAX_N]; int N, tot = 0; int gcd(int x, int y) { if(y == 0) return x; return gcd(y, x % y); } inline bool cmp(node a, node b) { return a.x * b.y < a.y * b.x; } int main() { //freopen("frac1.in", "r", stdin); //freopen("frac1.out", "w", stdout); scanf("%d", &N); printf("0/1\n"); for (int i=2; i<=N; i++) for (int j=1; j<=i; j++){ if(gcd(i, j) == 1) a[++ tot].x = j; a[tot].y = i; } sort(a+1, a+tot+1, cmp); for (int i=1; i<=tot; i++) printf("%d/%d\n", a[i].x, a[i].y); printf("1/1\n"); return 0; }
相关文章推荐
- 高德地图JS-API (超简单Get新技能√)
- websocket
- [国嵌攻略][054][NandFlash驱动设计_写]
- Maven 项目打包需要注意到的那点事儿
- sql2005查询字段名和说明
- 华为OJ题目(五):字符串最后一个单词的长度
- Linux性能评测工具之一:gprof篇
- JDK的具体安装
- Mysql配置及基础
- 导出到excel表格
- result cannot be resolved or is not a field
- 远程硬盘资源监控通用脚本
- 华为OJ题目(四):字符逆序
- (4.2)uboot详解——外部中断(GPIO)
- android 9path教程与去黑边
- 如何高效检查一个数组中是否包含某个值
- 第十一周项目1——二叉树算法验证(3)
- Yii出现“You are not authorized to perform this action.”的解决方法
- Foundation——结构体
- (转)java判断string变量是否是数字的六种方法小结