首页 > 其他分享 >欧拉函数——gcd问题的一大利器

欧拉函数——gcd问题的一大利器

时间:2024-02-02 11:14:02浏览次数:21  
标签:gcd limits sum varphi times 利器 欧拉

定义

欧拉函数,即 \(\varphi(n)\),表示的是 \([1, n]\) 内与 \(n\) 互质的数的个数,如 \(\varphi(1) = 1\)。

若 \(n\) 是质数,显然 \(\varphi(n) = n - 1\)。

性质

  • 欧拉函数是积性函数。

    若 \(\gcd(a, b) = 1\),则 \(\varphi(a \times b) = \varphi(a) \times \varphi(b)\)。

    更特殊地有,当 \(n\) 是奇数时,\(\varphi(2n) = \varphi(n)\)。

  • \(n = \sum\limits_{d | n} \varphi(d)\)。

    记 \(f(x) = \sum\limits_{i = 1}^n[\gcd(i, n) = x]\),则有 \(n = \sum\limits_{i = 1}^n f(i)\)。

    若 \(\gcd(k, n) = d\),则 \(\gcd(\dfrac kd, \dfrac nd) = 1\),故 \(f(d) = \varphi(\dfrac nd)\)。

    综上有:\(n = \sum\limits_{d | n}\varphi(\dfrac nd) = \sum\limits_{d | n}\varphi(d)\)。

  • 若 \(n = p^k\),其中 \(p\) 是质数,则 \(\varphi(n) = p^k - p^{k - 1}\)。

    由上一条性质得:\(p^k = \sum\limits_{i = 0}^k \varphi(p^i)\),于是显然后 \(p^k - p^{k - 1} = \varphi(p^k)\)。

  • 设 \(n = \prod\limits_{i = 1}^sp_i^{k_i}\),其中 \(p_i\) 是质数(即将 \(n\) 质因数分解),有 \(\varphi(n) = n \times \prod\limits_{i = 1}^s\dfrac{p_i - 1}{p_i}\)。

    由第一条性质得:\(\varphi(n) = \prod\limits_{i = 1}^s \varphi(p_i^{k_i})\)。

    由第三条性质得:\(\varphi(p_i^{k_i}) = p_i^{k_i} - p_i^{k_i - 1} = p_i^{k_i}(1 - \dfrac1{p_i})\)。

    综上有:\(\varphi(n) = \prod\limits_{i = 1}^sp_i^{k_i} \times \prod\limits_{i = 1}^s\dfrac{p_i - 1}{p_i} = n \times \prod\limits_{i = 1}^s\dfrac{p_i - 1}{p_i}\)。

实现

如果是求单个数的欧拉函数,直接质因数分解求就好了,时间复杂度最坏是 \(\mathcal O(\sqrt n)\),一般很难跑满,得是质数的平方数才能卡到 \(\mathcal O(\sqrt n)\),实际跑更像 \(\mathcal O(\log n)\)。

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

实际上欧拉函数也可以通过欧拉筛求得。

在欧拉筛中,每个合数都会被它最小的质因数筛掉,设当前合数为 \(n\),其最小质因数为 \(p\),记 \(n' = \dfrac np\),分讨:

\[\varphi(n) = \begin{cases}p \times \varphi(n') & p | n' \\ \varphi(p) \times \varphi(n') & \rm{otherwise} \end{cases} \]

第二种情况是好理解的,显然此时 \(\gcd(p, n') = 1\),然后就可以用积性函数的性质了,但第一种情况是为什么呢?

若 \(p | n'\),则说明 \(n\) 和 \(n'\) 的质因数构成的集合 \(S\) 是相同的,此时有:

\[\begin{aligned} \varphi(n) &= p \times n' \times \prod_{i = 1}^sp_i^{k_i} \\ &= p \times (n' \times \prod_{i = 1}^sp_i^{k_i}) \\ &= p \times \varphi(n') \end{aligned} \]

欧拉筛求 \([1, n]\) 内欧拉函数的时间复杂度是 \(\mathcal O(n)\)。

int phi[N];
bool vis[N];
vector<int> prime;

void getphi(int n) {
    phi[1] = 1;
    for (int i = 2; i <= n; i++) {
        if (!vis[i]) prime.emplace_back(i), phi[i] = i - 1;
        for (int p : prime) {
            if (p * i > n) break;
            vis[p * i] = 1;
            if (i % p) phi[p * i] = phi[p] * phi[i];
            else {phi[p * i] = p * phi[i]; break;}
        }
    }
}

欧拉定理

若 \(\gcd(a, m) = 1\),则 \(a^{\varphi(m)} \equiv 1 \pmod m\)。

当 \(m\) 是质数时,\(\varphi(m) = m - 1\),有 \(a^{m - 1} \equiv 1 \pmod m\),这就是 费马小定理,它是欧拉定理的一种特殊情况。

扩展欧拉定理

\[a^b = \begin{cases}a^{b \bmod \varphi(p)} & \gcd(a, p) = 1 \\ a^b & \gcd(a, p) \ne 1, b \le \varphi(p) \\ a^{b \bmod \varphi(p) + \varphi(p)} & \gcd(a, p) \ne 1, b > \varphi(p) \end{cases} \pmod p \]

例题

P2158 [SDOI2008] 仪仗队

给定一个 \(n \times n\) 的方阵,方阵上的点会互相遮挡,问在方阵左下角能看到的点数。\(n \le 4 \times 10^4\)。

把行和列都从 \(0 \sim N - 1\) 编号,然后所求转化为:

\[2 + \sum_{i = 1}^{n - 1}\sum_{j = 1}^{n - 1}[\gcd(i, j) = 1] \]

套上欧拉函数,得:

\[1 + 2\sum_{i = 1}^{n - 1} \varphi(i) \]

要特判 \(n = 1\) 的情况。

时间复杂度 \(\mathcal O(n)\)。

P2155 [SDOI2008] 沙拉公主的困惑

求 \([1, n!]\) 中与 \(m!\) 互质的数的数量,对 \(998244353\) 取模。\(m \le n \le 10^7\)。

答案是 \(\sum\limits_{i = 1}^{n!}[\gcd(i, m!) = 1]\),由 \(\gcd(a, b) = \gcd(b, a \bmod b)\) 得 \(\gcd(i + km!, m!) = \gcd(m!, i)\),故答案转化为 \(\dfrac{n!}{m!}\varphi(m!)\)。

考虑递推地求解 \(\varphi(n!)\)。

\[\varphi(n!) = \begin{cases}\varphi[(n - 1)!] \times (n - 1) & n \in \rm{prime} \\ \varphi[(n - 1)!] \times n & \rm{otherwise} \end{cases} \]

然后注意 \(n, m\) 可能大于等于模数的情况即可。

时间复杂度 \(\mathcal O(n)\)。

标签:gcd,limits,sum,varphi,times,利器,欧拉
From: https://www.cnblogs.com/chy12321/p/18002783

相关文章

  • 欧拉函数学习笔记
    前言本人能力有限,有错误欢迎指出。定义\(\varphi(n)\)表示的是小于等于\(n\)和\(n\)互质的数的个数。公式设\(n=\prod\limits_{i=1}^{s}p_i^{k_i}\),有\[\begin{aligned}\varphi(n)&=\prod_{i=1}^s\varphi(p_i^{k_i})\\&=\prod_{i=1}^sp_i^{k_i}-p_i^{k_i-1}\\&=\prod......
  • 内网隧道利器Pritunl
    一、简介pritunl是分布式企业内网服务器安全工具,具备web管理界面,有开源版本和收费版本,开源版本功能受限,一般小公司用免费版本就够用了#官方网站https://pritunl.com/#官方文档https://docs.pritunl.com/docs#Github项目地址https://github.com/pritunl/pritunl#客户......
  • UOJ #33 树上 GCD
    套路地,对每个\(g\in[1,n-1]\)求出有多少对无序对\((u,v)\)满足\(g|f(u,v)\),然后就可以用一个倒序枚举的\(\mathcalO(n\logn)\)的容斥求出答案。考虑点分治,对每个经过分治中心\(c\)的\(u\rightsquigarrow\text{lca}(u,v)\rightsquigarrowv\)只需分两种......
  • Uva--10129 Play On Words(欧拉路)
    记录15:422023-5-26reference:《算法竞赛入门经典第二版》例题6-16把字母看作结点,单词看成有向边,则问题有解,当且仅当图中有欧拉路径。有向图欧拉道路(回路)问题,有向图欧拉道路需要基图连通,且度数满足最多只能有两个点的入度不等于出度,而且必须是其中一个点的出度恰好比入......
  • 揭秘 Wasitai:AI 图像生成检测利器
    引言Wasitai是一款强大的工具,它允许用户检查一张图片是否由机器生成。用户只需拖拽并放置一张图片或从设备中选择一张,该工具将对图像进行处理,以确定它是由人还是机器生成的。Wasitai的功能1.图像生成检测:Wasitai主要功能是检测图像的生成方式,判断其是否由人工智能或机器生......
  • CF1174E Ehab and the Expected GCD Problem
    EhabandtheExpectedGCDProblemLuoguCF1174E题目描述\(p\)是一个排列,定义\(f(p)\):设\(g_i\)为\(p_1,p_2,\cdots,p_i\)的最大公因数(即前缀最大公因数),则\(f(p)\)为\(g_1,g_2,\cdots,g_n\)中不同的数的个数。设\(f_{max}(n)\)为\(1,2,\cdots,n\)的所有排......
  • TimeHero:远程团队的智能工作管理利器
    引言TimeHero是一款面向远程团队设计的AI助力工作管理工具。与传统的任务应用不同,它不仅仅局限于跟踪截止日期,而是通过自动规划日常任务、项目和循环工作,为个人和团队提供即时自动调整的计划。该工具可以适应不断变化的优先事项、已完成的任务或不断变化的日程安排,从而为个人和......
  • 基于Java和Vue开发的企业Ehr数智化人力管理系统源码+配套文档(提升人力资源管理效率的
    写在前面:随着企业规模的不断扩大和人力资源管理的日益复杂,传统的人力资源管理方式已经无法满足现代企业的需求。为了提高管理效率、优化资源配置、降低人力成本,越来越多的企业开始引入eHR人力资源管理系统。本文将重点介绍eHR系统在招聘管理、人事管理、考勤管理、绩效管理、社保......
  • 基于Java+Vue开发的企业Ehr数智化人力管理系统源码+配套文档(提升人力资源管理效率的利
    写在前面:随着企业规模的不断扩大和人力资源管理的日益复杂,传统的人力资源管理方式已经无法满足现代企业的需求。为了提高管理效率、优化资源配置、降低人力成本,越来越多的企业开始引入eHR人力资源管理系统。本文将重点介绍eHR系统在招聘管理、人事管理、考勤管理、绩效管理、社保......
  • 通达信强势狙击副图/选股公式 寻强股利器指标源码
    结合五日乖离率和均线角度做的选股,分享给大家,强势股的指标信号一般都有高收益高风险的特征,所以大家还需要谨慎使用。 AA05:=MA(C,5),COLOR0099CC;五日乖离率:=(C-AA05)/AA05*100;BB05:=ATAN((AA05/REF(AA05,1)-1)*100)*180/3.1416;速度5:=SMA(EMA((AA05-REF(AA05,1))/REF(AA......