素數篩法 poj2689
阿新 • • 發佈:2018-12-12
#include"cstdio" #include"cstring" using namespace std; #define MAX 100000//求MAX範圍內的素數 long long su[MAX],cnt; bool isprime[MAX]; void prime() { cnt=1; memset(isprime,1,sizeof(isprime));//初始化認為所有數都為素數 isprime[0]=isprime[1]=0;//0和1不是素數 for(long long i=2;i<=MAX;i++) { if(isprime[i]) su[cnt++]=i;//儲存素數i for(long long j=1;j<cnt&&su[j]*i<MAX;j++) { isprime[su[j]*i]=0;//篩掉小於等於i的素數和i的積構成的合數 } } } int main() { prime(); for(long long i=1;i<cnt;i++) printf("%d ",su[i]); return 0; }
例題:
自己太傻了,poj2689
素數篩法
第一遍爆int,數論題極容易爆int吧,關鍵這也太難查了吧,我都不知道自己到底爆了多少次了,下次一定要注意才行
第二遍還要特判1,主要後面還好,前面爆int太慘了,不想看了,就是想交。
還有其實l-r範圍內的素數可以用sqrt(r)內的素數來篩
原理就是sqrt後面的合數都可以由前面的素數表示,而後面的素數一定要乘前面的數才可以表示
不可能存在兩個後半部分素數相乘的結果,(因為這樣就超過r了)