一、线性筛法

众所周知。。。线性筛就是在O(n)的时间里找出所有素数的方法

code:

 void get_prime(int N){
int i, j, k;
memset(Flag, sizeof(Flag), );
for (i = ; i <= N; ++i){
if (!Flag[i])
p[++tot] = i;
for (j = ; j <= tot; ++j){
if ((k = i * p[j]) > N) break;
Flag[k] = ;
if (!(i % p[j])) break;
}
}
}

为什么这是线性的呢?

因为程序中利用了性质"每个合数必有一个最小素因子",于是每个合数仅被它的最小素因子筛去正好一次,所以是线性时间。

每个合数仅被它的最小素因子筛去正好一次的体现在于:if (!(i % p[j])) break;

如果不理解的话可以手动算一下i = 2 to 15的情况就可以明白啦!

(p.s. 其实准确的复杂度是O(n * loglogn)的,但是loglogn趋近于一个常数)

二、利用线性筛法求欧拉函数

欧拉函数phi(n)的值定义为1到n中与n互质的数的个数。

如phi(1) = 1, phi(2) = 1, phi(3) = 2, phi(4) = 2, phi(5) = 4, phi(6) = 2...

那么如何利用线性筛来求呢?

我们需要知道以下性质(证略):

(1)若n为质数,phi(n) = n - 1;

(2)若(n % a == 0 && (n / a) % a == 0) 则有:phi(n) = phi(n / a) * a;

(3)若(n % a == 0 && (n / a) % a != 0) 则有:phi(n) = phi(n / a) * (a - 1);

于是就可以做了,code:

 void get_phi(int N){
int i, j, k;
memset(Flag, sizeof(Flag), );
phi[] = ;
for (i = ; i <= N; ++i){
if (!Flag[i])
p[++tot] = i, phi[i] = i - ;
for (j = ; j <= tot; ++j){
if ((k = i * p[j]) > N) break;
Flag[k] = ;
if (!(i % p[j])){
phi[k] = phi[i] * p[j];
break;
}else
phi[k] = phi[i] * (p[j] - );
}
}
}

三、线性筛的其他应用 --计算Mobius函数μ[n]

首先我们定义μ[d]:

(1)若d = 1,那么μ[d] = 1

(2)若d = p1 * p2 * … * pr (r个不同质数,且次数都唯一)μ[d] = (-1) ^ r

(3)其余 μ[d] = 0

可以得到性质:

∑(d|n) μ[d] = 0 (n > 1)

而n = 1时,上式等于1

Mobius函数在积性函数的计算中非常重要,此处略过不讲。

利用上面提到的性质就可以求μ[n]了,code:

 void get_u(int N){
int i, j, k;
memset(Flag, sizeof(Flag), );
u[] = ;
for (i = ; i <= N; ++i){
if (!Flag[i])
p[++tot] = i, u[i] = -;
for (j = ; j <= tot; ++j){
if ((k = i * p[j]) > N) break;
Flag[k] = ;
if (!(i % p[j])){
u[k] = ;
break;
} else u[k] = -u[i];
}
}
}

noip知识点总结之--线性筛法及其拓展的更多相关文章

  1. Noip知识点备考

    作为一个oier,适当的整理是有必要的.蒟蒻根据自己的理解,筛选出考noip应当掌握的知识点.可能后期还有解题思路和模板,先挖个坑慢慢补呗. 60级张炳琪Noip知识点总结 可能是本人比较弱,写的内容 ...

  2. <转载>一般筛法和快速线性筛法求素数

    素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用 ...

  3. NOIp知识点复习——最短路计数

    $Mingqi\_H$ NOIp 2017考挂了...gg 重新开始好了. 计划明年2月24号前复习完所有的NOIp知识点(毕竟很不熟练啊),之后到七月底前学习完省选的东西(flag?). 从现在开始 ...

  4. Project Euler 46 Goldbach's other conjecture( 线性筛法 )

    题意: 克里斯蒂安·哥德巴赫曾经猜想,每个奇合数可以写成一个素数和一个平方的两倍之和 9 = 7 + 2×1215 = 7 + 2×2221 = 3 + 2×3225 = 7 + 2×3227 = 1 ...

  5. [算法]素数筛法(埃氏筛法&线性筛法)

    目录 一.素数筛的定义 二.埃氏筛法(Eratosthenes筛法) 三.线性筛法 四.一个性质 一.素数筛的定义 给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选 ...

  6. 素数筛 : Eratosthenes 筛法, 线性筛法

    这是两种简单的素数筛法, 好不容易理解了以后写篇博客加深下记忆 首先, 这两种算法用于解决的问题是 : 求小于n的所有素数 ( 个数 ) 比如 这道题 在不了解这两个素数筛算法的同学, 可能会这么写一 ...

  7. noip知识点总结之--欧几里得算法和扩展欧几里得算法

    一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a  ...

  8. (第三场) H Diff-prime Pairs 【数论-素数线性筛法+YY】

    题目链接 题目描述 Eddy has solved lots of problem involving calculating the number of coprime pairs within s ...

  9. noip知识点总结之--贪心

    一.什么是贪心 贪心算法嘛... 就是在对某个问题求解时,总是做出在当前看来是最好的选择 In other wors,并不是从整体最优上加以考虑,而是在获得某种意义上的局部最优解 二.贪心算法的适用前 ...

随机推荐

  1. 手机页面中的meta标签

    以前看书的时候,觉得meta标签就只有一个charset对于我来说是有用的.前段时间有个学弟让我写个手机版的网页,我才知道原来meta标签有那么多学问. meta指元素可提供有关页面的元信息(meta ...

  2. ThreadLocal 实现线程内共享变量

    package com.cn.gbx; import java.util.Date; import java.util.Random; import java.util.Timer; import j ...

  3. mysql 性能问题

    1.场景,模拟一天的数据,每个10秒,遍历1000个设备,每个设备模拟一个实时数据,总的数据量为:24*60*60/10*1000 = 864万条记录.2.采用策略,对时间分段,拼接sql语句查询,对 ...

  4. Python学习笔记16—电子表格

    openpyl 模块是解决 Microsoft Excel 2007/2010 之类版本中扩展名是 Excel 2010 xlsx/xlsm/xltx/xltm 的文件的读写的第三方库. 安装 pip ...

  5. Android 代码混淆 防止反编译

    为了防止代码被反编译,因此需要加入混淆.混淆也可以通过第三方进行apk混淆,也可以用android中的proguard进行混淆. 混淆步骤: 1.配置混淆文件,名字可以随意,在这里使用proguard ...

  6. iOS——为Xcode编译POCO C++静态库

    一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C+ ...

  7. 转:桥接模式(Bridge)

    转自:http://www.cnblogs.com/rush/archive/2011/06/29/2093743.html  分析十分透彻明了  可以再结合另外一篇文章中的示例理解(http://b ...

  8. jquery中html(), text(),val()区别(zhuan)

    https://zhidao.baidu.com/question/307317838.html http://www.cnblogs.com/aqbyygyyga/archive/2011/11/0 ...

  9. 20160805_Cent6.4x64_安装配置(含网卡驱动的配置)

    ZC: 全程 root用户 操作. 1.我在BIOS中将 UEFI关闭了,然后 才安装的 Cent6.4x64 (ZC: 安装系统时,一起安装了 gcc等一些编程用的包.本来是想安装QT时少点麻烦的, ...

  10. opencl初探-sobel检测

    sobel检测的C版本,neon和GPU的时间比较. Platform: LG G3, Adreno 330 ,img size 3264x2448 sobel: C code neon GPU 73 ...