hdu-5391 Zball in Tina Town
打表找规律,发现除了n=4时为2之外,素数的(n-1)的阶乘%n都为n-1,合数的结果都为0,下面是一种常用的求素数的方法,及一种筛素数的高效的方法
感兴趣的可以看看这篇blog
素数判断算法(高效率)
方法1:
#include <cstdio>
#include <cstring>
bool prim(int x)
{
if(x==2)
return true;
for(int i=2;i*i<=x;i++)
if(x%i==0)
return false;
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(n==4)
puts("2");
else if(prim(n))
printf("%d\n",n-1);
else
puts("0");
}
}
方法2:
#include <cstdio>
#include <cstring>
const int N=100005;
bool vis[N];
int pr[N];
int c;
void init()
{
c=0;
memset(vis,true,sizeof vis);//假设所有数都是素数
memset(pr,0,sizeof pr); //记录素数
for(int i=2;i<=100000;i++)
{
if(vis[i]) //2一定是素数
{
pr[c++]=i;
}
for(int j=0;j<c,pr[j]*i<=100000;j++)
{
vis[pr[j]*i]=false;//凡是有质因子的数都筛除
if(i%pr[j]==0) //直到i
break;
}
}
}
int main()
{
int t;
scanf("%d",&t);
init();
while(t--)
{
int n;
scanf("%d",&n);
if(n==4)
puts("2");
else if(n<=100000){
if(vis[n])
printf("%d\n",n-1);
else
puts("0");
}
else{
bool f=false;
//100000之后的数要再筛一次
for(int i=0;i<c,pr[i]*pr[i]<=n;i++)
{
if(n%pr[i]==0){
f=true;
break;
}
}
if(f)
puts("0");
else
printf("%d\n",n-1);
}
}
}