1. 程式人生 > >模板:線性篩質數

模板:線性篩質數

線性篩質數

功能

輸出從01000000的所有質數。

思路

首先01不是質數,從2開始逐個判斷是否為質數。如果t為質數,那麼對於任意正整數kk×t不是質數,因此可以將k×t篩去。如果t已經被篩去,那麼t不是質數,但仍然要將k×t篩去。為了避免重複篩選,需要對篩選條件加以限制,當且僅當kk×t除了1以外的最小因數時將k×t篩去,這樣可以保證每個數最多被篩選1次。當k×t被篩去時,k必然為質數,對於t,如果t為質數,那麼k2t;如果t為合數,那麼k2t除了1以外的最小因數。

時間複雜度

O

(n)

模板

#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所有因數的和。設一共有k種質因數,質因數ti的數量為ai,那麼因數和為i=1kj=0aitij

模板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 Arraysdp + 線性 + 分解質因數 + 組合數結論

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