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,并不是从整体最优上加以考虑,而是在获得某种意义上的局部最优解 二.贪心算法的适用前 ...
随机推荐
- django(一)搭建开发环境
本学习系列均使用centos7操作系统,基于python3进行操作.centos7下的python3安装配置http://www.cnblogs.com/Guido-admirers/p/625941 ...
- POJ 3104 Drying(二分答案)
题目链接:http://poj.org/problem?id=3104 ...
- iOS - UIWindow
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIWindow : UIView @available(iOS 2.0, *) public class UIWi ...
- Nginx基础知识之————Nginx 环境的搭建?
本课时主要给大家讲解如何在 Linux 系统下搭建 Nginx 和 Nginx 搭建过程中常见问题的知识,并结合实例让学员掌握 Nginx 环境的搭建. 下载解压: 安装gcc-c++ 从新配置文件: ...
- 从网页(WEB)登录SAP
以下这篇文章写得很详细,照着做就可以了: http://www.doc88.com/p-293361232332.html 设好后, 默认的端口是80$$, 其中$$是安装SAP时的instanc ...
- CXF WebService 开发文档
参考资料: 1. http://cxf.apache.org/docs/ 2. http://www.cnblogs.com/hoojo/archive/2011/03/30/1999587.html ...
- 初试Celery
从@到celery 一.文档: 官网:http://www.celeryproject.org/ Celery3.1 ------------2016-7-19 18:26:55-- source:[ ...
- asp.net开发中经常用到的方法
---天气插件--- <iframe width="560" scrolling="no" height="23" framebord ...
- TortoiseSvn
TortoiseSVN 是svn版本控制系统的一个免费开源客户端,它是svn版本控制的 Windows 扩展.可以使你避免使用枯燥而且不方便的命令行.它完全嵌入 Windows Explorer,使用 ...
- android坐标
说来说去都不如 画图示意 简单易懂啊!!!真是的! 来吧~~先上张图~~! (一)首先明确一下 android 中的坐标系统 : 屏幕的左上角是坐标系统原点(0,0) 原点向右延伸 ...