整数的唯一分解定理:

\(\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复习——线性筛(欧拉筛)的更多相关文章

  1. 素数筛&&欧拉筛

    折腾了一晚上很水的数论,整个人都萌萌哒 主要看了欧拉筛和素数筛的O(n)的算法 这个比那个一长串英文名的算法的优势在于没有多次计算一个数,也就是说一个数只筛了一次,主要是在%==0之后跳出实现的,具体 ...

  2. 欧拉筛,线性筛,洛谷P2158仪仗队

    题目 首先我们先把题目分析一下. emmmm,这应该是一个找规律,应该可以打表,然后我们再分析一下图片,发现如果这个点可以被看到,那它的横坐标和纵坐标应该互质,而互质的条件就是它的横坐标和纵坐标的最大 ...

  3. The Euler function(线性筛欧拉函数)

    /* 题意:(n)表示小于n与n互质的数有多少个,给你两个数a,b让你计算a+(a+1)+(a+2)+......+b; 初步思路:暴力搞一下,打表 #放弃:打了十几分钟没打完 #改进:欧拉函数:具体 ...

  4. POJ2909_Goldbach's Conjecture(线性欧拉筛)

    Goldbach's Conjecture: For any even number n greater than or equal to 4, there exists at least one p ...

  5. 欧拉筛(线性筛) & 洛谷 P3383 【模板】线性筛素数

    嗯.... 埃氏筛和欧拉筛的思想都是相似的: 如果一个数是素数,那么它的所有倍数都不是素数.... 这里主要介绍一下欧拉筛的思路:(欧拉筛的复杂度大约在O(n)左右... 定义一个prime数组,这个 ...

  6. 埃氏筛优化(速度堪比欧拉筛) + 洛谷 P3383 线性筛素数 题解

    我们一般写的埃氏筛消耗的时间都是欧拉筛的三倍,但是欧拉筛并不好想(对于我这种蒟蒻) 虽然 -- 我 -- 也可以背过模板,但是写个不会的欧拉筛不如写个简单易懂的埃氏筛 于是就有了优化 这个优化还是比较 ...

  7. 欧拉筛 线性筛 素数+莫比乌斯的mu[]

    https://blog.csdn.net/qq_39763472/article/details/82428602 模板来自https://blog.csdn.net/Avalon_cc/artic ...

  8. POJ-3126.PrimePath(欧拉筛素数打表 + BFS)

    给出一篇有关素数线性筛和区间筛的博客,有兴趣的读者可以自取. 本题大意: 给定两个四位的素数,没有前导零,每次变换其中的一位,最终使得两个素数相等,输出最小变换次数.要求变换过程中的数也都是素数. 本 ...

  9. POJ3090 Visible Lattice Points 欧拉筛

    题目大意:给出范围为(0, 0)到(n, n)的整点,你站在原点处,问有多少个整点可见. 线y=x和坐标轴上的点都被(1,0)(0,1)(1,1)挡住了.除这三个钉子外,如果一个点(x,y)不互质,则 ...

随机推荐

  1. ES6标准中的import和export

    在ES6前, 前端使用RequireJS或者seaJS实现模块化, requireJS是基于AMD规范的模块化库,  而像seaJS是基于CMD规范的模块化库,  两者都是为了为了推广前端模块化的工具 ...

  2. Ubuntu Server 19.04配置静态IP

    这个/etc/netplan下默认有个文件50-cloud-init.yaml,直接修改它就行了 sudo vim /etc/netplan/50-cloud-init.yaml 网口名字enp0s3 ...

  3. springboot文件上传 流的方式 后台计算上传进度

    //代码 public static void main(String[] args) throws Exception { String path = "f:/svn/t_dictiona ...

  4. 前端学习(十二):CSS排版

    进击のpython ***** 前端学习--CSS排版 本节主要介绍网页排版中主要格式化元素属性 帮助开发者把css技术与网页排版紧密联系到一起,来更好的实现网页设计效果 字体属性 字体 在日常工作中 ...

  5. ~~网络编程(四):socket套接字~~

    进击のpython ***** 网络编程--socket socket的中文意思叫做套接字,socket方法其实也叫套接字方法 我们研究过TCP/UDP协议,但是要是让我们自己搭建,就十分困难了 而这 ...

  6. linux gdb 入门级教程(小白专用)

    送给包含我在内的所有小白: 对于养linux真姬的本小白来说,既然你选择养它,那你就要满足他. 如果你养了它是为了码代码,那我觉得gdb应该是它的基本需求了吧?! 然而gdb哪有那些IDE来的简单啊, ...

  7. dp入门例题(1)

    按摩师问题 https://leetcode-cn.com/problems/the-masseuse-lcci/ (找好状态转移方程) 今天只和昨天的状态相关,依然是分类讨论: 今天不接受预约:或者 ...

  8. PHP 实例 - AJAX 与 XML-AJAX XML 实例

    PHP 实例 - AJAX 与 XML AJAX 可用来与 XML 文件进行交互式通信. AJAX XML 实例 下面的实例将演示网页如何通过 AJAX 从 XML 文件读取信息: 实例   Sele ...

  9. Skill 导出所有Layer信息用于tapeout

    https://www.cnblogs.com/yeungchie/ 用于在 tapeout 前要走的流程,foundry 会需要你上传一份芯片用到的所有 Layer 的 excel 文档. TAB ...

  10. Dynamics 365 CRM On premise Unable to Load plug-in assembly

    背景介绍: 本地部署Microsoft Dynamics CRM 9.0正常可用,后打补丁到9.0.16.7,打开系统quote报 “ Unable to Load plug-in assembly” ...