一、线性筛法

众所周知。。。线性筛就是在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. 转 iOS和android游戏纹理优化和内存优化(cocos2d-x)

    iOS和android游戏纹理优化和内存优化(cocos2d-x) (未完成) 1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x不同平台读取纹理的机制不同.ios下面使用CGImage, ...

  2. poj1556The Doors

    链接 枚举两点 若不和任何线段相交 建边为dis(i,j) floyd求最短路 #include <iostream> #include<cstdio> #include< ...

  3. mysql 循环控制

    1.使用whileDROP PROCEDURE IF EXISTS `addstudent`;DELIMITER ;;CREATE PROCEDURE `addstudent`(iNum int)BE ...

  4. hdu 4870 Rating

    题目链接:hdu 4870 这题应该算是概率 dp 吧,刚开始看了好几个博客都一头雾水,总有些细节理不清楚,后来看了 hdu 4870 Rating (概率dp) 这篇博客终于有如醍醐灌顶,就好像是第 ...

  5. 免费在线客服QQ_网页接入及使用说明

    首先,注册一个QQ (haha,我觉得也是废话) 到QQ推广的网站设置,生成代码 链接:http://shang.qq.com/v3/widget.html 选择“免费开通”,然后就会看到下图,一般只 ...

  6. SDL2.0的加载图片贴图

    加载图片贴图,采用了SDL_Window.SDL_Renderer.SDL_Texture和SDL_Image库 实例: #include <stdio.h> #include <m ...

  7. J2EE 第二阶段项目之部署项目、分工安排

    SVN 先通过使用教程,和能够介绍了解svn. svn使用教程总结   ;   svn功能介绍. 分工安排:我的任务就是项目统计. 1 效益统计 1 教育效益统计表 (教育效益统计表,增,改,查看,查 ...

  8. Css_加载样式

    第一种效果: 代码如下: <div class="loading"> <span></span> <span></span&g ...

  9. dom jaxp详解

    转自 http://blog.csdn.net/java958199586/article/details/7277904 一.XML解析技术概述 1.XML解析方式分为两种:dom和sax (1)d ...

  10. mac air/pro 启用三指拖动手势

    mac air/pro 启用三指拖动手势 一直以来用mac触控版丰富的手势来完成日常的工作,非常的效率和方便! 今天重新安装了系统发面三指拖动不好用了! 仔细查看了 设置--触控板 里面的各种选择尝试 ...