整数的唯一分解定理:

\(\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. ‘100%’wuxiao

    有时候设置控件的width:’100%‘无效,  群友解释, 因为父控件的大小要靠自空间撑起来,确定    ??????

  2. web自动化 -- HTMLreport(四)测试报告默认不展开输出内容

    一.需求痛点 1.默认展开输出内容,很不好查看每条用例的状态,而且也很丑 2.希望默认不展开输出内容 3.痛点截图 二.解决步骤 1.直接修改成这样子 三.效果

  3. 想理解JVM看了这篇文章,就知道了!(一)

    前言 ​ 本章节属于Java进阶系列,前面关于设计模式讲解完了,有兴趣的童鞋可以翻看之前的博文,后面会讲解JVM的优化,整个系列会完整的讲解整个java体系与生态相关的中间件知识.本次将对jvm有更深 ...

  4. 一个edit的学习笔记

    https://blog.csdn.net/woshizoe/article/details/51555396

  5. Btree索引和Hash索引

    B-Tree 索引 BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符, ...

  6. 手牵手,从零学习Vue源码 系列二(变化侦测篇)

    系列文章: 手牵手,从零学习Vue源码 系列一(前言-目录篇) 手牵手,从零学习Vue源码 系列二(变化侦测篇) 陆续更新中... 预计八月中旬更新完毕. 1 概述 Vue最大的特点之一就是数据驱动视 ...

  7. 数据结构C语言实现----顺序查找

     建立上图的一个txt文件: 1004 TOM 1001002 lily 951001 ann 931003 lucy 98 用一个c程序读入这个表一个结构体数组中: 结构体如下: //学生数据结构体 ...

  8. PHP umask() 函数

    ------------恢复内容开始------------ 定义和用法 umask() 函数改变文件的文件权限. 该函数把 PHP 的 umask 设置为 mask & 0777 并返回原来 ...

  9. mysql安装和配置详解以及Navicat连接失败问题

    好久没安装过MySQL了,今天安装了下竟然碰壁了, 就来做个笔记吧.安装步骤如下: 记住:一定要看到最后!!!!!!!!! 一. 安装  1.安装 (https://dev.mysql.com/dow ...

  10. 转载——完整的ASCII码表

    完整的ASCII码表,转载自下面的博主: http://www.cnblogs.com/xmxu/archive/2012/07/10/2584032.html