模板:線性篩質數
線性篩質數
功能
輸出從到的所有質數。
思路
首先和不是質數,從開始逐個判斷是否為質數。如果為質數,那麼對於任意正整數,不是質數,因此可以將篩去。如果已經被篩去,那麼不是質數,但仍然要將篩去。為了避免重複篩選,需要對篩選條件加以限制,當且僅當為除了以外的最小因數時將篩去,這樣可以保證每個數最多被篩選次。當被篩去時,必然為質數,對於,如果為質數,那麼從到;如果為合數,那麼從到除了以外的最小因數。
時間複雜度
模板
#include <iostream>
using namespace std;
#include <cstring>
const int MAX = 1000000;
int pos; // the amount of prime
int check[MAX]; // 0 to prime, 1 to composite
int prime[MAX]; // the prime numbers
/**
* @other: 0 and 1 are not prime numbers
*/
void PRIME() {
memset(check, 0, sizeof(check));
pos = 0 ;
for (int i = 2; i < MAX; ++i) {
if (check[i] == 0) prime[pos++] = i;
for (int j = 0; j < pos; ++j) {
if (prime[j]*i > MAX) break; // check the numbers in the range
check[prime[j]*i] = 1;
if (i % prime[j] == 0) break; // to avoid checking repeatly
}
}
}
擴充套件1
利用篩選得到的質數對n
進行分解質因數。
模板1.1
#include "PRIME.h"
int count[MAX]; // the amount of prime numbers
/**
* @param n: number N
*/
void EXT1(int n) {
memset(count, 0, sizeof(count));
for (int i = 0; n > 1; ++i) {
while (n % prime[i] == 0) ++count[i];
}
}
模板1.2
#include "EXT1.h"
int amount; // the amount of prime factors
int factor[MAX]; // the prime factors
/**
* @param n: number N
*/
void EXT2(int n) {
amount = 0;
for (int i = 0; prime[i]*prime[i] <= n; ++i) {
while (n % prime[i] == 0) {
factor[amount++] = prime[i];
n /= prime[i];
}
}
if (n > 1) factor[amount++] = n;
}
擴充套件2
計算n
所有因數的和。設一共有種質因數,質因數的數量為,那麼因數和為。
模板2
#include "EXT2.h"
/**
* @param n: number N
* @return: the sum of factors
*/
int EXT3(int n) {
int ans = 1; // the sum of factors
for (int i = 0; i < pos; ++i) {
int tmp = 1; // the power of prime[i]
int sum = 1; // the sum of powers
for (int j = 0; j < count[i]; ++j) {
tmp *= prime[i];
sum += tmp;
}
ans *= sum;
}
return ans;
}
相關推薦
模板:線性篩質數
線性篩質數 功能 輸出從00到10000001000000的所有質數。 思路 首先00和11不是質數,從22開始逐個判斷是否為質數。如果tt為質數,那麼對於任意正整數kk,k×tk×t不
P3383 【模板】線性篩素數
... right else cst pre left 數據 ret col 題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入格式: 第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢
luogu_3383 【模板】線性篩素數
bre rime esp turn bit %d rim style clu 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,cnt,prime[10000010],noprime[1
【luogu 3383】【模板】線性篩素數
100% put pre esp log main col i++ 每一個 題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入格式: 第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。 接
【數論】線性篩質數
一次 數論 [1] utc syn else == ring tdi 核心思想: 保證每個合數只會被它的最小質因數篩去,因此每個數只會被標記一次,所以時間復雜度是O(n) 此過程中保證了兩點: 合數一定被幹掉了... 每個數都沒有被重復地刪掉
洛谷 P3383 【模板】線性篩素數
toolbar left 整數 show scan fin names 一行 bar P3383 【模板】線性篩素數 題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入
【模板】線性篩(洛谷P3383)
Description 如題,給定一個範圍\(N\),你需要處理\(M\)個某數字是否為質數的詢問(每個數字均在範圍\(1-N\)內) Input 第一行包含兩個正整數\(N\)、\(M\),分別表示查詢的範圍和查詢的個數。 接下來\(M\)行每行包含一個不小於1且不大於\(N\)的整數,即
基礎題 P3383 【模板】線性篩素數 洛谷 簡單
題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入格式: 第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。 接下來M行每行包含一個不小於1且不大於N的整數,即詢問該數是否為質數。 輸出格式: 輸出包含M
[洛谷]P3383 【模板】線性篩素數 (#數學 -1.15)
題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入格式: 第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。 接下來M行每行包含一個不小於1且不大於N的整數,即詢問該數是否為質數。 輸出格式:
luogu P3383 【模板】線性篩素數
強推洛穀日報 寫的超棒! (洛穀日報裡的文章都超好 (所以我就不說什麼了 質數判定方法 #include<cstdio> #include<cstring> using namespace std; #define maxn 10000010 in
素篩講解及模板(線性篩)
本文連結:http://blog.csdn.net/sjf0115/article/details/8693756 <1>方法一 //判斷是否是一個素數 int IsPrime(int a){ //0,1,負數都是非素數
【模板】線性篩素數(埃篩+歐篩)
本來打算自己寫一篇的,但在找埃篩的程式碼時找到了一篇不錯的題解,修改了一點內容上的表述分享出來,原作者的洛谷ID為 dormantbs 我們常說的線篩是指線上性時間內把素數篩出來的過程,這裡介紹兩種篩法. 一般篩法(埃拉託斯特尼篩法,之後簡稱為埃篩): 基
數論——【模板】線性篩素數
題目來源 洛谷P3383【模板】線性篩素數 https://www.luogu.org/problem/show?pid=3383 思路 線性篩素數模板題 時間複雜度:O(n) 程式碼(C++
數論模板(1) 質數判斷、線性篩、樸素尤拉函式線性篩
1.素數的判斷 從去年退役之後,本人重回競賽界,開始新的人生,只是忘記的東西太多,一點點地複習吧 先來說質數的判斷 首先,一個數是質數的充分必要條件是,除了1和本身沒有其他因子,(順便說一下1也不是素數,其實1被認為既不是素數也不是合數)。因此最最樸素的演算法是
【 數學基礎】【素數線性篩法--歐拉篩法模板】【普通篩法的優化】
for ++ 自身 素數 spa prime pri 沒有 大於 質數(素數):指大於1的所有自然數中,除了1和自身,不能被其它自然數整除的數 合數:比1大,但不是素數的數稱為合數,合數除了被1和自身整除,還能被其它數整除 質因數(素因數或質因子):能整除給定正整數的質
計蒜客 2017 NOIP 提高組模擬賽(四)Day1 T1 小X的質數 線性篩素數
範圍 線性篩 mat 需要 接下來 包含 能夠 數字 bottom 小 X 是一位熱愛數學的男孩子,在茫茫的數字中,他對質數更有一種獨特的情感。小 X 認為,質數是一切自然數起源的地方。 在小 X 的認知裏,質數是除了本身和 1 以外,沒有其他因數的數字。 但由於小 X
質數,$varphi$和$mu$線性篩
amp gpo else break init blog bre typedef ++ typedef long long ll; bool check[N]; int mu[N],pri[N],tot; ll phi[N]; void init(int lim){
Codeforces 893E Counting Arrays:dp + 線性篩 + 分解質因數 + 組合數結論
tdi mem sizeof nlogn 表示 color esp span 整數 題目鏈接:http://codeforces.com/problemset/problem/893/E 題意: 共q組數據(q <= 10^5),每組數據給定x,y(x,y &
莫比烏斯線性篩(模板)
//線性篩法求莫比烏斯函式 bool check[MAXN+10]; long long prime[MAXN+10]; int mu[MAXN+10]; void Moblus() { memset(check,false,sizeof(check)); mu[1] = 1;
【模板】尤拉篩法(線性篩法)
1 int n; 2 int p[MAX_N], cnt; 3 bool b[MAX_N]; 4 5 void Euler() 6 { 7 b[0] = b[1] = 1; 8 for(register int i = 2; i <= n; ++i) 9