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)不互质,则 ...
随机推荐
- python 复制以及更改列表操作
题目:设置一个老用户列表和一个新用户列表,检查老用户列表中是否与新注册的用户名字有重复(不区分大小写),老用户列表不能被破坏 usernames = ['admin','Tom','john','ja ...
- 3.TCP协议
一.TCP协议特点和报文段格式 面向连接的传输层协议 每一条TCP连接只能有两个端点 TCP提供可靠交付的服务,无差错,不丢失,不重复,按序到达 全双工通信 -> 发送缓冲:准备发送的数据&am ...
- 关于maven的一份小笔记
简介 项目里一直用的 maven,几乎天天和这个"熟知"的工具打交道,但是,最近我发觉自己对 maven 了解的还不够,例如,什么是 goal?什么是 phase?等等.趁着最近有 ...
- 如何理解Flutter中的asyc 和 await
https://blog.csdn.net/xdhc304/article/details/90232723 Flutter的语法非常精简, 对于异步任务, 只要使用asyc和awai 配合就能实现, ...
- Thymeleaf从入门到精通
什么是Thymeleaf 大家好,我是bigsai,今天我们来学习Thymeleaf,如果你对Thymeleaf比较陌生也不要紧,它很容易学习与理解,并有着自己鲜明的特色. 开始之前,我们依旧问一个问 ...
- 番外:socketserver用法
进击のpython ***** 番外:socketserver使用 是不是被一般写法,多进程写法,多线程写法甚至是协程写法搞的不可开交 云里雾里,仿佛将要放弃~再配上服务器要服务多个客户端 完蛋了,全 ...
- Salt 系统初始化
目录 编辑states文件 1.DNS配置 dns.sls(在init目录下创建一个files文件,然后把resolv.conf放到文件下) [root@master init]# cat dns. ...
- 一文带你学习DWS数据库用户权限设计与管理
前言 本文将介绍DWS基于RBAC(Role-Based Access Control,基于角色的访问控制)的数据库用户权限管理.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成 ...
- Python访问字符串中的值
Python访问字符串中的值: 1.可以使用索引下标进行访问,索引下标从 0 开始: # 使用索引下标进行访问,索引下标从 0 开始 strs = "ABCDEFG" print( ...
- Jmeter 中 CSV 如何参数化测试数据并实现自动断言
当我们使用Jmeter工具进行接口测试,可利用CSV Data Set Config配置元件,对测试数据进行参数化,循环读取csv文档中每一行测试用例数据,来实现接口自动化.此种情况下,很多测试工程师 ...