POJ 3842 大数判断素数 + 位运算优化判重

来源:互联网 发布:青铜器乐队知乎 编辑:程序博客网 时间:2024/06/05 20:10
 

#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<map>
#define M 100000.0
using namespace std;
int len,num=0;
int list[10000],p=0;
char str[10];
bool v[10];
int vv[312500];

int prime(int n)
{
int i;
if(n!=2&&!(n%2)||n!=3&&!(n%3)||n!=5&&!(n%5)||n!=7&&!(n%7))
return 0;
for(i=0;list[i]*list[i]<=n;i++)
{
if(!(n%list[i]))
return 0;
}
return n>1;
}

void initprime()
{
int i;
for(list[p++]=2,i=3;i<50000;i++)
if(prime(i))
list[p++]=i;
}

void dfs(int sum)
{
int i;
if(vv[sum/32]&(1<<(sum%32))) return ;
vv[sum/32]|=1<<(sum%32);
if(prime(sum)) num++;
for(i=0;i<len;i++)
{
if(!v[i])
{
v[i]=true;
dfs(sum*10+str[i]-'0');
v[i]=false;
}
}
}

int main()
{
int m;
initprime();
scanf("%d",&m);
while(m--)
{
num=0;
scanf("%s",str);
len=strlen(str);
memset(v,false,sizeof(v));
memset(vv,false,sizeof(vv));
dfs(0);
printf("%d\n",num);
}
return 0;
}