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. Java添加事件的四种方式

    Java添加事件的几种方式(转载了codebrother的文章,做了稍微的改动) /** * Java事件监听处理——自身类实现ActionListener接口,作为事件监听器 * * @author ...

  2. Swift 学习笔记1

    最近在看Swift,努力在看相关的文档以及书籍,因为Swift3.0的更新,以及它开源了,所以打算写一些关于Swift的相关文章.让Swift能够更好的被我理解

  3. ACE 6.2.0 AIX 编译

    注:ace只能使用gnu的make 一.IBM  AIX版本 $unameAIX$oslevel6.1.0.0$ ACE+TAO+CIAO-6.2.0.tar 二.GNU make版本:make-3. ...

  4. 推荐一款好用的java反编译软件——JavaDecompiler

    这款反编译器叫 "Java Decompiler",在网上也是久负盛名,最近因为工作需要找来用了下,果然不错,之前都是用eclipse的插件jad来看源码的.下面这个链接是Java ...

  5. 温故知新——json

    Json简介 Json(JavaScript Object Notation)是一种轻量级的数据交换格式.它是基于javascript(Standard ECMA-262 3rd Edition - ...

  6. Siverlight网页应用程序中WCF通信注意事项

    最近刚刚接触WCF通信,功能就是客户端点击按钮后,服务器端返回一个随机数字.在VS2010中调试的时候,通信都正常,但发布到IIS7中就没反应了,经过几天的摸索,发现WCF的配置要注意以下两点: 1. ...

  7. PL/SQL — 变长数组

    PL/SQL变长数组是PL/SQL集合数据类型中的一种,其使用方法与PL/SQL嵌套表大同小异,唯一的区别则是变长数组的元素的最大个数是有限制的.也即是说变长数组的下标固定下限等于1,上限可以扩展.下 ...

  8. ARM的工作环境和工作模式

    工作环境: 可以称之为“数据环境,”数据总线16位或者32位,应用于不同的情况下.16位的情况下,工作速度快,代码密度高. 工作模式: 设置程序数据所处的状态,为移植操作系统提供方便.

  9. 如何实现一个malloc函数

    一.概述 1.malloc简介 函数所在头文件:<stdlib.h> 函数原型是:void *malloc (size_t n) 函数功能:在内存的动态存储区中分配一个长度为size的连续 ...

  10. axure rp pro 6.5

    现在地址:http://www.xdowns.com/soft/1/95/2012/Soft_94434.html Axure6.5正式版推出了,大大改善了用户体验以及修复了很多6.0上的bug. 而 ...