首页 > 其他分享 >线性筛与欧拉函数

线性筛与欧拉函数

时间:2023-08-12 22:56:02浏览次数:40  
标签:phi 函数 int 质数 MN vis 线性 欧拉

很萌很可爱!就是把纸质笔记上 letex 写在这里有亿点慢


线性筛

埃氏筛, \(O(n\log\log n)\) ,思路是 ⌈ 标记所有质数的倍数 ⌋

这样每个合数可能会被标记好几次,我们改进一下,让每个合数只有一种被标记的方式,即 ⌈ 最小质因子 * 常数 ⌋

具体而言,⌈ 枚举 \(2\to x\) 把当前数 \(i\) 跟质数表每个不超过自己的最小质因子的质数成绩来标记掉 ⌋,这样就可以 \(O(n)\) 筛素数了!

int p[MN], top, phi[MN], vis[MN];
vis[1]=1, phi[1]=1;
for(int i=2; i<=n; ++i) {
    if(!vis[i]) p[++top]=i, phi[i]=i-1;
    for(int j=1; j<=top&&i*p[j]<=n; ++j) {
        int x=i*p[j]; vis[x]=1;
        if(i%p[j]!=0) phi[x]=(p[j]-1)*phi[i];
        else { phi[x]=phi[i]*p[j]; break; }
    }
}

欧拉函数

\(\phi(x)\) 表示 ⌈ 小于等于 \(x\) 的与 \(x\) 互质的数的个数 ⌋

这个 \(\phi(x)\) 怎么求呢,考虑 ⌈ 容斥 ⌋ 酱!

设 \(A_x\) 表示 \([1,n]\) 种是 \(x\) 的倍数的集合

\[\phi(n)=|\overline A_1\bigcap \overline A_2\bigcap \overline A_3...\bigcap \overline A_n| \]

\[\phi(x)=n-\sum_{q=1}^{n} {(-1)^q\sum_{1\leq d_i\leq n,d_i<d_{i+1}}{|A_{d_1}\bigcap A_{d2}...\bigcap A_{d_q}|}} \]

\[\phi (n)=n(1-\sum_{q=1}^{cntp}{\prod_{1\leq d_i\leq cntp,d_i<d_{i+1}}{p_{d_i}}}) \]

\[\phi (n)=n\prod_{i=1}^{cntp} (1-\frac{1}{p_i})=n\prod_{i=1}^{cntp} \frac{p_i-1}{p_i} \]

显然可以在 $O(\sqrt n) $ 时间求出质因子并且乘好,且显然不会有小数

int getPhi(int n){
    int ans=n;
    for(int i=2; i*i<=n; ++i)
        if(n%i==0){
            ans=ans*(i-1)/i;
            while(n%i==0) n/=i;
        }
    if(n>1) ans=ans*(n-1)/n ;
    return ans;
}

积性函数

定义正整数域上的函数 \(f(x)\),对于 \(\gcd (x,y)=1\) 的 \(x,y\) 有 \(f(xy)=f(x)f(y)\) 则称 \(f(x)\) 为积性函数

欧拉函数就是一个积性函数,对于符合条件的 \(x,y\) 祂们没有相同的质因子所以 \(\phi(xy)=\phi(x)\phi(y)\) 这个式子可以帮我们线性递推!!递推的起点可以是对于质数 \(p\) 有 \(\phi(p)=p-1\)

int n, top, p[MN], phi[MN];
bool vis[MN];
memset(vis,1,sizeof(vis));
vis[1]=0, phi[1]=1;
for(int i=2; i<=INF; ++i) {
	if(vis[i]) p[++top]=i, phi[i]=i-1;
	for(int j=1; j<=top&&i*p[j]<=INF; ++j) {
		int x=i*p[j]; vis[x]=0;
		if(i%p[j]!=0) phi[x]=(p[j]-1)*phi[i];
		else { phi[x]=phi[i]*p[j]; break; }
	}
}

不仅仅是欧拉函数,乘性函数大都可以用线性筛递推,比如约数和,约数个数,递推的时候为了保证找到互质可以分类讨论,具体而言,⌈ 记录最小因子的最高次幂 ⌋ ⌈ 质数用特殊性质求 ⌋ ⌈ 质数的幂用特殊性质求 ⌋ 就可以了


欧拉函数常用性质

质数 \(p\) 的 \(\phi(p)=p-1\)

若 \(n=p^k\),\(p\) 是质数,则 \(\phi(n)=(p-1)p^{k-1}\)

若 \(q\) 是质数,\(q\mid n\),则 \(\phi(nq)=q\phi(n)\)

若 \(q\) 是质数,\(q\nmid n\),则 \(\phi(nq)=(q-1)\phi(n)\)

对于 \(n\) 有 $ n=\sum_{d\mid n}{\phi(d)}$

标签:phi,函数,int,质数,MN,vis,线性,欧拉
From: https://www.cnblogs.com/chelsyqwq/p/17625755.html

相关文章

  • 区间半群查询与 Ackermann 函数
    最近在思考半在线卷积的复杂度有没有可能进一步优化,决定先理清类似的问题以寻求经验.一区间合并如果询问的时候不能进行半群运算,显然我们需要在预处理阶段处理所有答案,必须进行\(O(n^2)\)次计算.二区间合并如果询问的时候可以进行一次半群运算,则可以把序列每次在中......
  • 无涯教程-Perl - package函数
    描述此函数将当前符号表的名称更改为NAME。包名称的范围一直到封闭块的末尾。如果省略NAME,则没有当前包,并且所有函数和变量名称都必须使用其完全限定的名称声明。语法以下是此函数的简单语法-packageNAMEpackage返回值此函数不返回任何值。要了解package关键字,......
  • 无涯教程-Perl - pack函数
    描述此函数对LIST中的表达式求值并将其打包为EXPR指定的二进制结构。使用下表中显示的字符指定格式-每个字符可以可选地跟一个数字,该数字指定要打包的值的类型的重复计数。根据格式,该值是半字节,字符或什至位。*的值重复*,因为LIST中保留了尽可能多的值。可以使用拆包功能将......
  • 无涯教程-Perl - ord函数
    描述此函数返回EXPR指定的字符的ASCII数值,如果省略则返回$_。例如,ord('A')返回值为65。语法以下是此函数的简单语法-ordEXPRord返回值该函数返回整数。例以下是显示其基本用法的示例代码-#!/usr/bin/perl-wprint("ord()",ord('G'),"\n");执行上述代码后......
  • 无涯教程-Perl - my函数
    描述此函数声明LIST中的变量在包围式块内按词法范围。如果指定了多个变量,则所有变量都必须用括号括起来。语法以下是此函数的简单语法-myLIST返回值此函数不返回任何值。例以下是显示其基本用法的示例代码-#!/usr/bin/perl-wmy$string="Wearetheworld";p......
  • 无涯教程-Perl - msgsnd函数
    描述此功能使用可选的FLAGS将消息MSG发送到消息队列ID。语法以下是此函数的简单语法-msgsndID,MSG,FLAGS返回值该函数在错误时返回0,在成功时返回1。参考链接https://www.learnfk.com/perl/perl-msgsnd.html......
  • SystemExit异常 sys.exit()​​函数
    这个错误是SystemExit,它是Python中的一个异常类。当调用sys.exit()函数时,会引发SystemExit异常,这个函数用于退出程序。在你的代码中,sys.exit(0)被调用,参数0表示正常退出程序。在这种情况下,fun_read()函数中的某个条件被满足,导致程序调用了sys.exit(0)来退出。这可能是为了在某些情......
  • 机器学习线性代数基础
    本文是斯坦福大学CS229机器学习课程的基础材料,原始文件下载原文作者:ZicoKolter,修改:ChuongDo,TengyuMa翻译:黄海广备注:请关注github的更新,线性代数和概率论已经更新完毕。CS229机器学习课程复习材料-线性代数目录CS229机器学习课程复习材料-线性代数线性代数复习和参......
  • 无涯教程-Perl - msgget函数
    描述此函数调用系统VIPC函数msgget(2)。返回消息队列标识,如果有错误,则返回未定义的值。语法以下是此函数的简单语法-msggetKEY,FLAGS返回值该函数将在错误时返回undef,并在成功时返回消息队列ID。参考链接https://www.learnfk.com/perl/perl-msgget.html......
  • 无涯教程-Perl - msgrcv函数
    描述此函数从队列ID接收消息,并将消息放入变量VAR中,最大大小为SIZE。语法以下是此函数的简单语法-msgrcvID,VAR,SIZE,TYPE,FLAGS返回值该函数在错误时返回0,在成功时返回1。参考链接https://www.learnfk.com/perl/perl-msgrcv.html......