模板——素数筛

 1 int vis[maxn];
 2 int prime[maxn];
 3
 4 void sieve(int n) {
 5     int m = sqrt(n + 0.5);
 6     memset(m, 0, sizeof m);
 7     for(int i = 2; i <= m; i++) if(!vis[i])
 8         for(int j = i*i; j <= n; j += i) vis[j] = 1;
 9 }
10
11 int gen_prime(int n) {
12     sieve(n);
13     int c = 0;
14     for(int i = 2; i <= n; i++) if(!vis[i])
15         prime[c++] = i;
16     return c;
17 }    
时间: 2024-11-01 06:44:58

模板——素数筛的相关文章

素数筛 模板

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 int prim[3000000]={2,3,5}; 8 //素数是分为基本素数{2,3}.阳素数{6N+1,N>=1}形式的.阴素数{6N-1,N>=1}形式的 9 //为了代码的好写,在这里这样写的 : 10 //数除了{2,3,5}为素数,其他的数可以写成6N,6N+1

素数筛 + 前缀和 模板

素数筛 + 前缀和 模板 1 #include <bits/stdc++.h> 2 #define ll long long int 3 #define N 20000002 4 using namespace std; 5 int sum[N]; 6 bool a[N]; 7 int b[N]; 8 int cnt = 0; 9 int t,n; 10 11 int main() 12 { 13 a[0] = true; 14 for(int i=2; i*i<N; i++) 15 {

欧拉函数+素数筛

欧拉函数,就是欧拉发现的一个关于求素数的的公式,然后我们编个函数实现这个公式. 欧拉发现求小于等于n的正整数中有多少个数与n互质可以用这个公式: euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数.euler(1)=1(唯一和1互质的数就是1本身). 欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2. 其实直接看模板加注解想想就能看懂 筛选的原理就是找出n的因子,剔除含有

浅谈线性素数筛

素数筛的用处还是蛮多的,有很多和素数有关的题都要用到素数筛,所以有一个高效的筛法自然是非常好的吖,普通筛法(暴力筛法)就不说了,因为有了高效的也没人在会用普通筛法了吧. 线性素数筛是用每一个合数的最小的质因数筛掉它,所以时间复杂度保证是线性的. 模板:https://www.luogu.org/problemnew/show/P3383 代码: 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int

POJ 2635 The Embarrassed Cryptographer (同余线性方程+素数筛)

题目地址:POJ 2635 先用素数筛把10^6万以内素数筛出来.然后把输入的那个大数转化成数组,并且每三位存成一个数,这样可以节约内存和时间,然后利用同余线性的原理,对那个小整数以内的所有素数枚举,然后判断是否整除,找到最小的能被整除的. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #i

素数筛&amp;&amp;欧拉筛 BZOJ2818 Gcd BZOJ2190 [SDOI2008]仪仗队

折腾了一晚上很水的数论,整个人都萌萌哒 主要看了欧拉筛和素数筛的O(n)的算法 这个比那个一长串英文名的算法的优势在于没有多次计算一个数,也就是说一个数只筛了一次,主要是在%==0之后跳出实现的,具体的解释看的迷迷糊糊,特别是欧拉函数的求解 http://blog.csdn.net/lerenceray/article/details/12420725 代码如下 1 void ES(){ 2 for(int i=2;i<n;i++){ 3 if (!pd[i]){ 4 prime[++top]=

素数筛

这是我目前知道的打素数表最快的方法了----  差不多是O(n)的,100000以内花了0.005秒. 1 int prime[100005], np, vis[100005]; 2 3 void get_prime(int n){ 4 mset(prime); mset(vis); 5 np = 0; 6 for(int i = 2; i < n; i++){ 7 if(vis[i] != 1) 8 prime[np++] = i; 9 for(int j = 0, t; j < np &a

ACdream 1112 Alice and Bob (sg函数的变形+素数筛)

题意:有N个数,Alice 和 Bob 轮流对这些数进行操作,若一个数 n=a*b且a>1,b>1,可以将该数变成 a 和 b 两个数: 或者可以减少为a或b,Alice先,问谁能赢 思路:首先单看对每个数进行除法的操作,我们可以知道其实是在除以每个数的素因子或素因子之间的积 比如 70=2*5*7 我们可以变成 10(2*5)或 14(2*7) 或 35(5*7)或 2 或 5 或 7 或 1 这七种状态 当我们把他们(2,5,7)当作3个石子也就是一堆时,然而实际上我们是将这堆石子进行ni

最大公约数,最小公倍数,素数,素数筛

最大公约数 a.b的最大公约数是b,a%b的公约数,如果有一个等于0,最大公约数是a int gcd(int a,int n){ if (b==0) return a; else return gcd(b,a%b); } 或 return b!=0 ? gcd(b,a%b):a; 最小公倍数 是两数的乘积除以他们的最大公约数 素数筛 输出2-10000之间的所有素数 从2开始遍历,标记每个数的所有倍数为非素数 void sushu(){ for (int i=0;i<10000;i++){ ma