今天我們來學習一些關於素數和線性篩選法的知識,這類問題在acm-icpc中常常遇到,所以很有必要學好它。
首先,來看素數篩選的乙個題。
題目:
題意:給定區間
分析:由費馬平方和定理知道,乙個奇素數
只需要先篩選出所有素數,然後乙個乙個判斷即可,但是這個區間可能很大。普通的素數篩選法是用bool數
組,佔乙個位元組空間,這樣很耗費記憶體,實際上在c++中有乙個神器叫做bitset,它是以位為單位的。
**:
#include #include #include #include using namespace std;
const int n = 300000005;
bitsetprime;
void work(int l,int r)
}int cnt = (l <=2 && 2 <= r);
for(int i=5; i<=r; i+=4)
if(i >= l && prime[i]) cnt++;
cout<>l>>r;
work(l,r);
return 0;
}
題目:
題意:設
輸入乙個正整數
分析:可以先用線性篩選法求出
**:
#include #include #include using namespace std;
const int n = 1000005;
int sum[n];
bool ok[1005];
void init()
int k = -1;
for(int i=1; i= a)
}if(k == -1) puts("-1");
else printf("%d\n",p[k] - b);
}return 0;
}
題目:
題意:給定乙個數,求它的最大素因子在素數表中排列第幾。
分析:由於輸入很多,所以用篩選法預處理。
**:
#include #include #include using namespace std;
const int n = 1000005;
int rank[n];
void init()
for(int i=1; i<=max; i++)
}for(int i=1; i<=n; i++)
}int main()
線性篩選素數法
pri 1到pri n遞增,composite num1 n 在遍歷 1,n 的數時,剛好maxdivisor1 pri 3 pri 4 pri n 1 pri n。pri 1是是它最小的質因數。maxdivisor如果乘以乙個大於pri 3的質因數,例如pri 4,就找到另乙個合數 composi...
素數判斷與素數篩選法
方法一 直接判斷,思想簡單,實現比較簡單,但是複雜度過高bool isprime int a return true 方法二 素數篩選法 eratosthenes 篩法 只有素數才能當篩子 篩掉對應的倍數,不超過要求的範圍即可 遍歷一遍 void getprime int n 從i i開始計算 j ...
素數線性篩選
include include includeusing namespace std bool isprime 10000001 int pri 2000001 prin int findprime int maxn for int j 0 jmaxn break 當過大了就跳出 isprime i...