poj 3842 全排列+筛素数+暴力
2015-07-16 15:58
411 查看
题目没什么好说的,我的方法中只求解了[0,3400)的素数,算得上是一个优化吧。
据说把1000W以内的素数表打出来都能过...
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 10000000; const int M = 8; const int P = 3400; bool mark ; bool used[M]; int divide[M]; int digit[M]; char str[M]; int len, ans; bool flag[P]; int prime[P]; int cnt; void get() { memset( flag, 1, sizeof(flag) ); flag[0] = flag[1] = false; cnt = 0; for ( int i = 2; i < P; i++ ) { if ( flag[i] ) { prime[cnt++] = i; for ( int j = i + i; j < P; j += i ) { flag[j] = false; } } } } bool isPrime( int a ) { if ( a == 0 || a == 1 ) return false; for ( int i = 0; i < cnt; i++ ) { if ( prime[i] * prime[i] > a ) break; if ( a % prime[i] == 0 ) return false; } return true; } void judge( int depth ) { int num = 0; for ( int i = 0; i <= depth; i++ ) { num = num * 10 + digit[i]; } if ( isPrime(num) && !mark[num] ) { ans++; mark[num] = 1; } } void dfs( int depth ) { if ( depth >= len ) return ; for ( int i = 0; i < len; i++ ) { if ( !used[i] ) { digit[depth] = divide[i]; judge(depth); used[i] = 1; dfs( depth + 1 ); used[i] = 0; } } } int main () { get(); int t; scanf("%d", &t); while ( t-- ) { scanf("%s", str); len = strlen(str); for ( int i = 0; i < len; i++ ) { divide[i] = str[i] - '0'; } ans = 0; memset( used, 0, sizeof(used) ); memset( mark, 0, sizeof(mark) ); dfs(0); printf("%d\n", ans); } return 0; }
据说把1000W以内的素数表打出来都能过...
相关文章推荐
- Swift面向对象基础(中)——Swift中的方法
- Java 自动装箱与拆箱详解
- Android框架之快速开发框架xUtil
- 读取socket传过来的信息
- js 图片懒加载
- AVL树的插入与删除---Java实现
- win8 64bit/win7 32bit/winxp 32bit +QT+opencv环境配置教程,亲测成功
- 关于数组去重
- 实现jqgrid表格数据上下滚动
- ImageView设置图片的优化
- Android 中一些常用而又容易忘记的
- sqlServer 存储过程编写和调用
- pl/sql developer 连接oracle 11g数据库错误代码ora12557解决办法
- iOS错误报告中关于崩溃地址的分析
- Android 开发相关的Blog推荐——跟随大神的脚步才能成长为大神
- ABAP常用事物码
- Windows平台分布式架构实践 - 负载均衡
- Codeforces Round #243 (Div. 1)-A,B,C-D
- CentOS ntp同步
- 生活本来就不完美