noip知识点总结之--线性筛法及其拓展
一、线性筛法
众所周知。。。线性筛就是在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知识点总结之--线性筛法及其拓展的更多相关文章
- Noip知识点备考
作为一个oier,适当的整理是有必要的.蒟蒻根据自己的理解,筛选出考noip应当掌握的知识点.可能后期还有解题思路和模板,先挖个坑慢慢补呗. 60级张炳琪Noip知识点总结 可能是本人比较弱,写的内容 ...
- <转载>一般筛法和快速线性筛法求素数
素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用 ...
- NOIp知识点复习——最短路计数
$Mingqi\_H$ NOIp 2017考挂了...gg 重新开始好了. 计划明年2月24号前复习完所有的NOIp知识点(毕竟很不熟练啊),之后到七月底前学习完省选的东西(flag?). 从现在开始 ...
- Project Euler 46 Goldbach's other conjecture( 线性筛法 )
题意: 克里斯蒂安·哥德巴赫曾经猜想,每个奇合数可以写成一个素数和一个平方的两倍之和 9 = 7 + 2×1215 = 7 + 2×2221 = 3 + 2×3225 = 7 + 2×3227 = 1 ...
- [算法]素数筛法(埃氏筛法&线性筛法)
目录 一.素数筛的定义 二.埃氏筛法(Eratosthenes筛法) 三.线性筛法 四.一个性质 一.素数筛的定义 给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选 ...
- 素数筛 : Eratosthenes 筛法, 线性筛法
这是两种简单的素数筛法, 好不容易理解了以后写篇博客加深下记忆 首先, 这两种算法用于解决的问题是 : 求小于n的所有素数 ( 个数 ) 比如 这道题 在不了解这两个素数筛算法的同学, 可能会这么写一 ...
- noip知识点总结之--欧几里得算法和扩展欧几里得算法
一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a ...
- (第三场) H Diff-prime Pairs 【数论-素数线性筛法+YY】
题目链接 题目描述 Eddy has solved lots of problem involving calculating the number of coprime pairs within s ...
- noip知识点总结之--贪心
一.什么是贪心 贪心算法嘛... 就是在对某个问题求解时,总是做出在当前看来是最好的选择 In other wors,并不是从整体最优上加以考虑,而是在获得某种意义上的局部最优解 二.贪心算法的适用前 ...
随机推荐
- How to run an manually installed program from terminals in Linux / Ubuntu
Say we have installed qt programs and we want to run qtcreator from the command line. What we need h ...
- 《Linux内核设计的艺术》学习笔记(三)Jcond指令
参考书籍:<Assembly Language for x86 Processors (7th Edition)> ◆ JMPI指令: JMPI是x86实模式下的段间跳转指令: BOOTS ...
- weblogic与axis2 jar包冲突
1.org.springframework.web.util.NestedServletException: Handler processing failed; nested exception i ...
- PHP基础知识之————PDO预处理语句
转载处:http://www.cnblogs.com/xiaohuochai/p/6133353.html 定义 在生成网页时,许多PHP脚本通常都会执行除参数之外,其他部分完全相同的查询语句,针对这 ...
- JPA EntityManager详解(一)
JPA EntityManager详解(一) 持久化上下文(Persistence Contexts)的相关知识,内容包括如何从Java EE容器中创建EntityManager对象.如何从Java ...
- 禁止ubuntu的super快捷键
在mac上安装了ubuntu虚拟机, 但是发现command健(ubuntu中叫super健)被系统占用了, 习惯了command健的同学来说非常不方便, 如何禁用默认的command健呢? You ...
- [转载] iptables配置实践
原文: http://wsgzao.github.io/post/iptables/ iptables配置实践 By wsgzao 发表于 2015-07-24 文章目录 1. 前言 2. 更新历史 ...
- Codeforces 713D Animals and Puzzle
题意:一个n*m的01矩阵,Q个询问,每次询问一个矩形区域内,最大的全1正方形的边长是多少? 题解:dp[0][0][i][j]表示以(i, j)为右下角的正方形的最长边长.RMQ后,二分答案即可. ...
- 08 高效的SQL
编写高效 SQL 需要以下知识 有关所查询内容的物理组织的知识 数据库能做什么的知识, 例如: 如果你不知道跳跃扫描索引及其用途, 那么你可能会看着模式说”索引丢了” SQL 所有错综复杂的知识 对目 ...
- 图片的copy,从一个目录复制到另一个目录
代码: public function index(){ $path='G:/相片/2014.9.8深圳莲花山/IMG_1282.JPG'; $path=iconv('utf-8','gb2312', ...