最近新學習了一個神奇的判斷素數的方法
已知:大於等於5的質數一定和6的倍數相鄰
證明:令x≥1,將大於等於5的自然數表示如下:······6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······ 可以看到,不在6的倍數兩側,即6x兩側的數爲6x+2,6x+3,6x+4,由於2(3x+1),3(2x+1),2(3x+2),所以它們一定不是素數,再除去6x本身,顯然,素數要出現只可能出現在6x的相鄰兩側。這裏要注意的一點是,在6的倍數相鄰兩側並不是一定就是質數。根據以上規律,判斷質數可以6個爲單元快進,即循環中i+=6,加快判斷速度
證畢
最後小於5的特殊處理,大於6的在循環中枚舉着判斷
跑賊快
當然如果測試組數實在太多可能還是歐拉篩或者杜教篩、埃拉托色尼篩要更快一些
//反正luogu那道素數篩模板這種方法是可以168ms過的,另外幾種最快的也要1000+
#include <cmath> #include <cstdio> inline int read() { int n=0,w=1;register char c=getchar(); while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();} while(c>='0'&&c<='9')n=n*10+c-'0',c=getchar(); return n*w; } inline bool check(int x) { if(x==2||x==3)return true; if(x==1||(x%6!=1&&x%6!=5))return false; int y=sqrt(x); for(int i=5;i<=y;i+=6) if(!(x%i)||!(x%(i+2))) return false; return true; } int main() { int n,m; n=read(),m=read(); while(m--) { n=read(); if(check(n)) printf("Yes\n"); else printf("No\n"); } return 0; }