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);
}
}
}