POJ 3842 An Industrial Spy
2011-10-28 23:13
453 查看
/* 筛出10000000内的素数显然是不可行的; 筛出3400内的素数来检测10000000以内的数就ok了 另外已经搜索过的数用used标记,下次碰到标记过的就不在判断,剪掉很多。 */ #include <cstdio> #include <cstdlib> #include <string> #include <cstring> #include <map> #include <vector> #include <cmath> using namespace std; int f[10000],su[1000],nn=0; bool used[10000000]; int ans,len,a[8]; char str[10]; void init() { int i,j; memset(f,0,sizeof(f)); for(i=2;i<3400;i++) if(!f[i]) for(j=2*i;j<3400;j+=i) f[j]=1; for(i=2;i<3400;i++) if(!f[i]) su[nn++]=i; } int antry(int x) { if(x==0||x==1) return 0; for(int i=0;i<nn&&su[i]<x;i++) if(x%su[i]==0) return 0; return 1; } void dfs(int cur,int num,int ck) { if(used[num]) return; if(antry(num)&&!used[num]){ used[num]=1; ans++; } used[num]=1; if(cur==len) return; dfs(cur+1,num,ck); for(int i=0;i<len;i++){ if(num==0&&a[i]==0) continue; if(ck&(1<<i)) continue; dfs(cur+1,num*10+a[i],ck|(1<<i)); } } int main() { int t;init(); scanf("%d",&t); while(t--){ scanf("%s",str); ans=0; len=strlen(str); memset(used,0,sizeof(used)); for(int i=0;i<len;i++) a[i]=(str[i]-'0'); dfs(0,0,0); printf("%d\n",ans); } return 0; }
相关文章推荐
- poj 3842 An Industrial Spy
- LA 4609 ,poj 3842 An Industrial Spy
- POJ_3842_An Industrial Spy_筛法、素数表
- LA 4609 ,poj 3842 An Industrial Spy
- LA 4609 ,poj 3842 An Industrial Spy
- POJ 3842 An Industrial Spy 快筛质数+STL乱搞
- poj 3842 An Industrial Spy 筛法 全排列
- HUST team contest #2 A An Industrial Spy ||poj 3842 (筛)
- 南邮 OJ 1128 An Industrial Spy
- poj1738 An old Stone Game 石子合并(归并) GarsiaWachs算法
- [An AC a day]3624_POJ_ACM
- poj 2826 An Easy Problem?!(线段交,细节题)
- poj 2273 An Excel-lent Problem 类进制转换
- POJ 1738 An old Stone Game 石子合并之GarsiaWachs算法
- An Easy Problem?! POJ - 2826 (几何)
- POJ 1738:An old Stone Game 石子归并(GarsiaWachs算法)
- poj 1694 An old stone game
- POJ_1694_An Old Stone Game
- POJ3358 Period of an Infinite Binary Expansion【欧拉函数】
- POJ 1152 An Easy Problem!(进位制)