POJ 3842 An Industrial Spy 快筛质数+STL乱搞

原创 2014年10月11日 18:22:14

题目大意:n组数据,每组数据给出不超过7个数字,将这些数字排列,问能组成多少个素数。


思路:观察数据范围,7个数字,最多就是10^7个数,开一个bool就能存下那些是素数。当然最好还是线性筛,O(n)处理出来。然后组合数字当然可以搜索,但是我比较偷懒,直接全排列了。然后再为了防止重复计数,用一个map存一下是否搜过。就这样乱搞过了。


CODE:


#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 10000000
#define MAX 1000010
using namespace std;

map<int,bool> G;

int cases;
int temp,src[MAX],cnt,ans;
bool not_prime[INF];
int prime[MAX],primes;

char s[10];

void Pretreatment();
inline void Initialize();
inline void Judge();

int main()
{
	Pretreatment();
	for(cin >> cases;cases; --cases) {
		Initialize();
		scanf("%s",s + 1);
		cnt = strlen(s + 1);
		for(int i = 1;i <= cnt; ++i)
			src[i] = s[i] - '0';
		sort(src + 1,src + cnt + 1);
		do	Judge();	while(next_permutation(src + 1,src + cnt + 1));
		printf("%d\n",ans);
	}
	return 0;
}

void Pretreatment()
{
	not_prime[0] = not_prime[1] = true;
	for(int i = 2;i < INF; ++i) {
		if(!not_prime[i])
			prime[++primes] = i;
		for(int j = 1;j <= primes && i * prime[j] < INF; ++j) {
			not_prime[i * prime[j]] = true;
			if(i % prime[j] == 0)	break;	
		}
	}
}

inline void Initialize()
{
	cnt = ans = 0;
	G.clear();
}

inline void Judge()
{
	int now = 0;
	for(int i = 1;i <= cnt; ++i) {
		now = now * 10 + src[i];
		if(!not_prime[now] && !G[now])
			G[now] = true,ans++;
	}
}


POJ 3842 An Industrial Spy

/* 筛出10000000内的素数显然是不可行的; 筛出3400内的素数来检测10000000以内的数就ok了 另外已经搜索过的数用used标记,下次碰到标记过的就不在判断,剪掉很多。 */ #inc...
  • wsniyufang
  • wsniyufang
  • 2011年10月28日 23:13
  • 1148

poj 3842 An Industrial Spy(dfs+乱搞)

An Industrial SpyTime Limit: 1000MS Memory Limit: 65536K Total Submissions: 1733 Accepted:...
  • now_then
  • now_then
  • 2017年09月15日 20:55
  • 146

poj 3842 -- An Industrial Spy ( 全排列 )

用递归写了个全排列,还好 , 素数处理我是先打了个1000W 的素数表 , 测了一下打标大约500ms , 还不如直接暴力算素数  。。。。。 # include # include # inc...
  • dlut_ju
  • dlut_ju
  • 2013年03月25日 14:09
  • 780

POJ - 3842 An Industrial Spy dfs(水)

题意:给你一串数字,最少一个,最多七个,问用这里面的数字能组成多少素数,不重复。 思路:之前还遍历10000000的每一个素数,结果超时,后来发现直接dfs就可以了,只是标记一下做过的数。 ...
  • MacinChang
  • MacinChang
  • 2016年01月06日 15:38
  • 371

poj 3842 An Industrial Spy 筛法 全排列

poj 3842 An Industrial Spy 筛法 全排列 Description Industrial spying is very common for modern research l...
  • k_l_c_
  • k_l_c_
  • 2016年08月12日 15:38
  • 563

LA 4609 ,poj 3842 An Industrial Spy

题目地址:http://poj.org/problem?id=3842     或者: https://icpcarchive.ecs.baylor.edu/index.php?option=com_...
  • jingqi814
  • jingqi814
  • 2013年09月04日 01:36
  • 752

POJ 3842(质数判断)

7!=5040 所以这题直接求质数比打一千万的表都快 这提高诉我们阶乘其实不算大&看(算)清数据规模 Program cc; var n,t,len,i,j,ans:longint...
  • nike0good
  • nike0good
  • 2012年09月24日 21:34
  • 894

欧拉函数求法与欧拉筛法求素数

欧拉函数求法与欧拉筛法求素数
  • ChiLuManXi
  • ChiLuManXi
  • 2015年12月04日 13:50
  • 2734

大数区间筛素数 线性

const int N=1000010; int prime[N], np; bool vis[N]; void get_prime(int l,int r) { np = 0; me...
  • ehi11
  • ehi11
  • 2012年08月21日 20:27
  • 930

[51nod 1184]第N个质数

题目大意找第n个质数,n
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2017年01月12日 20:52
  • 1330
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3842 An Industrial Spy 快筛质数+STL乱搞
举报原因:
原因补充:

(最多只允许输入30个字)