您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: