noip复习——线性筛(欧拉筛)
整数的唯一分解定理:
\(\forall A\in \mathbb {N} ,\,A>1\quad \exists \prod\limits _{i=1}^{s}p_{i}^{a_{i}}=A\),其中\({\displaystyle p_{1}<p_{2}<p_{3}<\cdots <p_{s}}\)而且 \(p_{i}\)是一个质数, \(a_{i}\in \mathbb {Z} ^{+}\)(摘自维基百科)
欧拉筛通过使每个整数只会被它的最小质因子筛到来保证时间复杂度,可以用来筛质数。同时,利用这个性质可以在线性时间内筛出很多积性函数。
筛质数
for (int i = 2; i <= n; ++i)
{
if (!vis[i])
pri[++cnt] = i;
for (int j = 1; j <= cnt && pri[j] * i <= n; ++j)
{
vis[i * pri[j]] = 1;
if (i % pri[j] == 0)
break;
}
}
求欧拉函数\(\varphi\)
欧拉函数为1~n中和n互质的数的个数
所以如果\(n=p^k\), \(p\)是质数,那么\(\varphi(n)=\varphi(p^k)=p^k - p^{k-1}=p^{k-1}(p-1)=p^{k-1}\varphi(p)=p\ \varphi(p^{k-1})\)
结论很显然,因为除了\(p\)的倍数外,其他数都和\(n\)互质
所以在欧拉筛的时候,如果\(i\)是素数,那么\(\varphi(i)=i-1\)
如果\(i \bmod pri[j]==0\),也就是说\(pri[j]\)在\(i * phi[j]\)中出现了至少两次,那么\(\varphi(i * pri[j])=pri[j]*\varphi(i)\)
而如果\(i \bmod pri[j]!=0\),也就是\(phi[j]\)在\(i * phi[j]\)中第一次出现,那么\(gcd(i, phi[j])==1\),因为\(\varphi\)是积性函数,所以\(\varphi(i * pri[j])=\varphi(pri[j])*\varphi(i)\)
for (int i = 2; i <= n; ++i)
{
if (!vis[i])
pri[++cnt] = i,
phi[i] = i - 1;
for (int j = 1; j <= cnt && pri[j] * i <= n; ++j)
{
vis[i * pri[j]] = 1;
if (i % pri[j])
phi[i * pri[j]] = phi[i] * phi[pri[j]];
else
{
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
}
}
求莫比乌斯函数\(\mu\)
\(\mu (n)={\begin{cases}1 \qquad\quad (n=1)\\(-1)^{s}\quad (n无平方因子,s为素因子个数)\\0\qquad\quad else\\\end{cases}}\)
然后就,照着定义来行了
for (int i = 2; i <= n; ++i)
{
if (!vis[i])
pri[++cnt] = i,
mu[i] = -1;
for (int j = 1; j <= cnt && pri[j] * i <= n; ++j)
{
vis[i * pri[j]] = 1;
if (i % pri[j])
mu[i * pri[j]] = -mu[i];
else
break;
}
}
求约数个数\(\sigma_0/d\)
\(d(n)=\sum\limits_{i=1}^s{(a_i+1)}\), 另定义\(f(n)=a_1\)\(\quad(a、s定义见上文)\)
和欧拉函数类似。 如果\(i\)是素数,那么\(d(i)=2,f(i)=1\)
如果\(i \bmod pri[j]==0\),也就是说\(pri[j]\)在\(i * phi[j]\)中出现了至少两次,那么\(f(i * pri[j])=f(i)+1,d(i*pri[j])=d(i)/(f(i)+1)*(f(i)+2)\)\(\quad(消去pri[j]对i的影响,乘上pri[j]对i *pri[j]的影响)\)
而如果\(i \bmod pri[j]!=0\),也就是\(phi[j]\)在\(i * phi[j]\)中第一次出现,那么\(gcd(i, phi[j])==1\),因为\(d\)是积性函数,所以\(d(i * pri[j])=d(pri[j])*d(i)\)
for (int i = 2; i <= n; ++i)
{
if (!vis[i])
pri[++cnt] = i,
f[i] = 1,
d[i] = 2;
for (int j = 1; j <= cnt && pri[j] * i <= n; ++j)
{
vis[i * pri[j]] = 1;
if (i % pri[j])
f[i * pri[j]] = 1, d[i * pri[j]] = d[i] * d[pri[j]];
else
{
f[i * pri[j]] = f[i] + 1;
d[i * pri[j]] = d[i] / (f[i] + 1)* (f[i] + 2);
break;
}
}
}
noip复习——线性筛(欧拉筛)的更多相关文章
- 素数筛&&欧拉筛
折腾了一晚上很水的数论,整个人都萌萌哒 主要看了欧拉筛和素数筛的O(n)的算法 这个比那个一长串英文名的算法的优势在于没有多次计算一个数,也就是说一个数只筛了一次,主要是在%==0之后跳出实现的,具体 ...
- 欧拉筛,线性筛,洛谷P2158仪仗队
题目 首先我们先把题目分析一下. emmmm,这应该是一个找规律,应该可以打表,然后我们再分析一下图片,发现如果这个点可以被看到,那它的横坐标和纵坐标应该互质,而互质的条件就是它的横坐标和纵坐标的最大 ...
- The Euler function(线性筛欧拉函数)
/* 题意:(n)表示小于n与n互质的数有多少个,给你两个数a,b让你计算a+(a+1)+(a+2)+......+b; 初步思路:暴力搞一下,打表 #放弃:打了十几分钟没打完 #改进:欧拉函数:具体 ...
- POJ2909_Goldbach's Conjecture(线性欧拉筛)
Goldbach's Conjecture: For any even number n greater than or equal to 4, there exists at least one p ...
- 欧拉筛(线性筛) & 洛谷 P3383 【模板】线性筛素数
嗯.... 埃氏筛和欧拉筛的思想都是相似的: 如果一个数是素数,那么它的所有倍数都不是素数.... 这里主要介绍一下欧拉筛的思路:(欧拉筛的复杂度大约在O(n)左右... 定义一个prime数组,这个 ...
- 埃氏筛优化(速度堪比欧拉筛) + 洛谷 P3383 线性筛素数 题解
我们一般写的埃氏筛消耗的时间都是欧拉筛的三倍,但是欧拉筛并不好想(对于我这种蒟蒻) 虽然 -- 我 -- 也可以背过模板,但是写个不会的欧拉筛不如写个简单易懂的埃氏筛 于是就有了优化 这个优化还是比较 ...
- 欧拉筛 线性筛 素数+莫比乌斯的mu[]
https://blog.csdn.net/qq_39763472/article/details/82428602 模板来自https://blog.csdn.net/Avalon_cc/artic ...
- POJ-3126.PrimePath(欧拉筛素数打表 + BFS)
给出一篇有关素数线性筛和区间筛的博客,有兴趣的读者可以自取. 本题大意: 给定两个四位的素数,没有前导零,每次变换其中的一位,最终使得两个素数相等,输出最小变换次数.要求变换过程中的数也都是素数. 本 ...
- POJ3090 Visible Lattice Points 欧拉筛
题目大意:给出范围为(0, 0)到(n, n)的整点,你站在原点处,问有多少个整点可见. 线y=x和坐标轴上的点都被(1,0)(0,1)(1,1)挡住了.除这三个钉子外,如果一个点(x,y)不互质,则 ...
随机推荐
- Flutter + Android 混合开发
JIT (Just In Time) 即时编译器, 边执行边编译 程序运行时,JIT 编译器选择将最频繁执行的方法编译成本地代码.运行时才进行本地代码编译而不是在程序运行前进行编译 AOT可以理解为“ ...
- jenkins集群(三) -- master和slave配置git
一.Linux(master)上安装git 1.运行命令:yum -y install git 2.git的默认安装目录是: 二.给Linux下Git配置好秘钥(公钥 + 私钥) 1.添加用户和密码 ...
- CSS帧动画
CSS帧动画 基础知识 通过定义一段动画中的关键点.关键状态来创建动画.@Keyframes相比transition对动画过程和细节有更强的控制. 过渡动画是两个状态间的变化,帧动画可以处理动画过程中 ...
- 小书MybatisPlus第7篇-代码生成器的原理精讲及使用方法
本文是本系列文章的第七篇,前6篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 小书Mybatis ...
- Java基础之java8新特性(1)Lambda
一.接口的默认方法.static方法.default方法. 1.接口的默认方法 在Java8之前,Java中接口里面的默认方法都是public abstract 修饰的抽象方法,抽象方法并没有方法实体 ...
- Apache HTTP Server 虚拟主机配置
Apache HTTP Server 虚拟主机配置(三) 什么是虚拟主机 "虚拟主机"是指在一个机器上运行多个网站(比如:www.company1.com 和 www.c ...
- 深入探究JVM之垃圾回收算法实现细节
@ 目录 前言 垃圾回收算法实现细节 根节点枚举 安全点 安全区域 记忆集和卡表 写屏障 并发的可达性分析 低延迟GC Shenandoah ZGC 总结 前言 本篇紧接上文,主要讲解垃圾回收算法的实 ...
- python工业互联网应用实战3—模型层构建
本章开始我们正式进入到实战项目开发过程,如何从需求分析获得的实体数据转到模型设计中来,变成Django项目中得模型层.当然,第一步还是在VS2019 IDE环境重创建一个工程项目,本文我们把工程名称命 ...
- SpringBoot之整合Quartz调度框架-基于Spring Boot2.0.2版本
1.项目基础 项目是基于Spring Boot2.x版本的 2.添加依赖 <!-- quartz依赖 --> <dependency> <groupId>org.s ...
- GitHub 热点速览 Vol.30:那些提升效率的小工具们
摘要:虽然 GitHub 是一个学习技术的好去处,但是除了学习,它还集提高"搬砖"效率于一身.GitHub 上散落着各式各样的小工具,比如本周特推的 Adobe 开源的 React ...