An Industrial Spy
 

Description

Industrial spying is very common for modern research labs. I am such an industrial spy - don't tell anybody! My recent job was to steal the latest inventions from a famous math research lab. It was hard to obtain some of their results but I got their waste out of a document shredder. 
I have already reconstructed that their research topic is fast factorization. But the remaining paper snippets only have single digits on it and I cannot imagine what they are for. Could it be that those digits form prime numbers? Please help me to find out how many prime numbers can be formed using the given digits.

Input

The first line of the input holds the number of test cases c (1 <= c <= 200). Each test case consists of a single line. This line contains the digits (at least one, at most seven) that are on the paper snippets.

Output

For each test case, print one line containing the number of different primes that can be reconstructed by shuffling the digits. You may ignore digits while reconstructing the primes (e.g., if you get the digits 7 and 1, you can reconstruct three primes 7, 17, and 71). Reconstructed numbers that (regarded as strings) differ just by leading zeros, are considered identical (see the fourth case of the sample input).

Sample Input

4
17
1276543
9999999
011

Sample Output3

1336
0
2
题意:给你一串数字,问你他们能组成多少个不同的素数。 思路:枚举这些数字的组合的排列,打一张素数表直接判断。这题时间限制很紧啊(1000ms),在无限TLE之后,我把memset(vis,0,sizeof(vis))这句删除之后跑了844ms,险过,memset怎么会那么坑,不是说内部实现是调用批处理吗,为什么还那么慢???
另外,打素数表的时候,注意姿势。。。,不然必然超时。
Ps:按照刚进实验室时某大三学长教我的那个写法打素数表时超时,当时他还说两种方法都一样,现在才发现坑了我们。
下面是三个版本的: 1.dfs+二进制枚举优化 (844ms)
 #include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define MAXN 10000000
char isp[MAXN], visp[MAXN], vis[MAXN];
int a[], t[], sum;
void init(){
memset(isp, , sizeof(isp));
isp[] = isp[] = ;
for(int i = ;i*i<MAXN;i ++)
if(!isp[i])
for(int j = i*i;j < MAXN;j += i)
isp[j] = ;
return;
}
int ToNum(int n){
int sum = ;
for(int i = ;i < n;i ++) sum = sum* + t[i];
return sum;
}
void dfs(int n, int dep){
if(dep == n){
int tmp = ToNum(n);
if(!isp[tmp] && !visp[tmp]){
sum++;
visp[tmp] = ;
}
return;
}
for(int i = ;i < n;i ++){
if(!vis[i]){
vis[i] = ;
t[dep] = a[i];
dfs(n, dep+);
vis[i] = ;
}
}
}
int main(){
char str[];
int tt, n, b[];
init();
scanf("%d", &tt);
while(tt--){
memset(str, , sizeof(str));
scanf("%s", str);
int len = strlen(str);
for(int i = ;i < len;i ++) b[i] = str[i]-'';
memset(visp, , sizeof(visp));
int ans = ;
int UP = ( << len);
for(int i = ;i < UP;i ++){
int k = ;
for(int j = ;j < len;j ++)
if(i & ( << j)) a[k++] = b[j];
sum = ;
//memset(vis,0,sizeof(vis); 这句加上就超时。。。
dfs(k, );
ans += sum;
}
printf("%d\n", ans);
}
return ;
}

2. 普通dfs不加优化(969ms。。。)


 #include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define MAXN 10000000
char isp[MAXN], visp[MAXN], vis[MAXN];
int a[], t[], sum;
void init(){
memset(isp, , sizeof(isp));
isp[] = isp[] = ;
for(int i = ;i*i<MAXN;i ++)
if(!isp[i])
for(int j = i*i;j < MAXN;j += i)
isp[j] = ;
return;
}
int ToNum(int n){
int sum = ;
for(int i = ;i < n;i ++) sum = sum* + t[i];
return sum;
}
void dfs(int n, int dep, int cnt){
if(dep == cnt){
int tmp = ToNum(cnt);
if(!isp[tmp] && !visp[tmp]){
sum++;
visp[tmp] = ;
}
}
for(int i = ;i < n;i ++){
if(!vis[i]){
vis[i] = ;
t[dep] = a[i];
dfs(n, dep+, cnt);
vis[i] = ;
}
}
}
int main(){
char str[];
int tt, n;
init();
scanf("%d", &tt);
while(tt--){
memset(str, , sizeof(str));
scanf("%s", str);
int len = strlen(str);
for(int i = ;i < len;i ++) a[i] = str[i]-'';
memset(visp, , sizeof(visp));
int ans = ;
for(int i = ;i <= len;i ++){
//memset(vis, 0, sizeof(vis)); 加上就超时。。。
sum = ;
dfs(len, , i);
ans += sum;
}
printf("%d\n", ans);
}
return ;
}

3.C++ STL库 next_permutation(a,a+k)函数 + 二进制优化(813ms),可以看出并不比dfs快多少,况且没有调用ToNum函数,减少了程序运行时跳转的时间
 #include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define MAXN 10000000
using namespace std;
char isp[MAXN], visp[MAXN], vis[MAXN];
int a[], t[], sum;
void init(){
memset(isp, , sizeof(isp));
isp[] = isp[] = ;
for(int i = ;i*i<MAXN;i ++)
if(!isp[i])
for(int j = i*i;j < MAXN;j += i)
isp[j] = ;
return;
}
int ToNum(int n){
int sum = ;
for(int i = ;i < n;i ++) sum = sum* + a[i];
return sum;
}
void dfs(int n, int dep){
if(dep == n){
int tmp = ToNum(n);
if(!isp[tmp] && !visp[tmp]){
sum++;
visp[tmp] = ;
}
return;
}
for(int i = ;i < n;i ++){
if(!vis[i]){
vis[i] = ;
t[dep] = a[i];
dfs(n, dep+);
vis[i] = ;
}
}
}
int main(){
char str[];
int tt;
init();
scanf("%d", &tt);
while(tt--){
memset(str, , sizeof(str));
scanf("%s", str);
int len = strlen(str);
sort(str, str+len);
memset(visp, , sizeof(visp));
int ans = , UP = ( << len);
for(int i = ;i < UP;i ++){
int k = ;
for(int j = ;j < len;j ++)
if((i >> j) & ) a[k++] = str[j]-'';
sum = ;
//memset(vis,0,sizeof(vis)) 加上同样超时。。。
do{
int tmp = ;
for(int i = ;i < k;i ++) tmp = tmp*+a[i];
if(!isp[tmp] && !visp[tmp]){
sum++;
visp[tmp] = ;
}
}while(next_permutation(a, a+k));
ans += sum;
}
printf("%d\n", ans);
}
return ;
}

 




 

POJ -- 3842的更多相关文章

  1. POJ - 3842 An Industrial Spy dfs(水)

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

  2. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  3. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  4. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  5. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  6. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  7. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

  8. POJ 2255. Tree Recovery

    Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11939   Accepted: 7493 De ...

  9. POJ 2752 Seek the Name, Seek the Fame [kmp]

    Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17898   Ac ...

随机推荐

  1. C++对象创建与释放

    创建对象有以下四种形式: #include <iostream> using namespace std; class A{ private: int i; public: A(){ co ...

  2. C# 中关闭当前线程的四种方式 .

    .net类库已经帮助我们实现了窗口的关闭,如果此窗口是系统的主窗口,关闭此窗口即应该退出了整个应用程序.但事实上有时候并不是这样的,关闭窗口,只是停止了当前窗口的消息循环.系统主窗口,实质上是Main ...

  3. PHP LINUX Notice: undefined $_GET完美解决方法

    PHP Notice: undefined 平时用$_GET[‘xx’] 取得参数值时,如果之前不加判断在未传进参数时会出现这样的警告: PHP Notice: undefined index xxx ...

  4. vb delphi7、2010 csharp vb.net空白测试程序

    工作中难免在网上看到一段不错的代码,希望能够拿来测试一次,为了避免每次测试都要新建一个空白测试程序,索性预先建立好,要用的时候复制一遍,然后打开直接粘贴需要测试的代码进行测试.

  5. 【BZOJ】1088: [SCOI2005]扫雷Mine

    1088: [SCOI2005]扫雷Mine Description 相 信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的 ...

  6. 我的第一个python代码实践:Trie树

    Trie树 不解析,  本园很多博文有提到. 直接上代码: #coding:utf-8 ''' create on 2013-07-30 @author :HuangYanQiang ''' LETT ...

  7. IndexedDB 增删改查 简单的库

    <!DOCTYPE html> <html> <head> <title></title> <script src="Ind ...

  8. iOS 7隐藏statusbar

    - (BOOL)prefersStatusBarHidden { return YES; } [[UIApplication sharedApplication] setStatusBarHidden ...

  9. ASP.Net 添加 Interop for Word, excel 插件

    1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 3:依次双 ...

  10. Jquer学习

    1:什么是Jquery 2:jquery的例子 3:后记