首页 > 其他分享 >P5091 【模版】扩展欧拉定理

P5091 【模版】扩展欧拉定理

时间:2023-12-20 20:33:06浏览次数:28  
标签:phi limits space 模版 bmod varphi P5091 prod 欧拉

求 \(a^b \bmod m, b\le 10^{200000}\)。

首先引入三种可以通过取模缩小幂指数的方法。

  1. 费马小定理:当 \(a,p\in \mathbb{Z},\space p\) 为质数且 \(p\nmid a\) 时,\(a^{p-1}\equiv 1(\bmod\space p)\),所以有 \(a^b\equiv a^{b\bmod (p-1)}(\bmod\space p)\);
  2. 欧拉定理:当 \(a,m\in\mathbb{Z},\space a,m\) 互质时,\(a^{\varphi(m)}\equiv 1(\bmod\space m)\),其中欧拉函数 \(\varphi(n)\) 为 \([1,n]\) 中与 \(n\) 互质的数的个数。由此, \(a^b=a^{b\bmod\varphi(m)}(\bmod\space m)\);
  3. 扩展欧拉定理:当 \(a,m\in\mathbb{Z}\) 时,
    \( a^b=\left\{ \begin{aligned} & a^b&, b\le\varphi(m) \\\ & a^{b\bmod\varphi(m)+\varphi(m)},&b>\varphi(m) \end{aligned} \right.(\bmod\space m) \)。

此题没有给出 \(a,m\) 间的互质关系,只能采用扩展欧拉定理解决。只需求出 \(\varphi(m)\) 即可,我们可以采取分解质因数的方法,结合欧拉函数公式
\( \varphi(n)=\left\{ \begin{aligned} & 1 &,n=1 \\\ & n\prod\limits_{i=1}^{k}(1-\dfrac{1}{p_i}) &,n\neq 1 \end{aligned} \right. \)
来 \(O(\sqrt{m})\) 地求解。公式里的 \(k,p_i\) 来自 \(n\) 的唯一分解 \(n=\prod\limits_{i=1}^{k} p_i,\space p_i\) 为质数。

int phi = m;
for (int p = 2; n > 0; p++) {
    if (n % p != 0) continue;
    phi -= phi / p; // 公式中 (1-1/p) 的变形
    while (n % p == 0) n /= p;
}

下面延伸介绍一下欧拉函数的知识。除了公式,还有五种方法可以计算欧拉函数:

  1. 若 \(p\) 为质数,\(\varphi(p)=p-1\);
  2. 若 \(p\) 为质数,\(n=p^k\),有 \(\varphi(n)=p^k-p^{k-1}\),即 \([1,n]\) 去掉了 \(p,2p,3p\cdots p^{k-1}p\) 共计 \(p^{k-1}\) 个数;
  3. 积性:若 \(a,b\) 互质,\(\varphi(ab)=\varphi(a)\varphi(b)\),因为此时 \(a,b\) 的质因子 \(\{pi\},\{qi\}\) 均不相同,所以 \(\varphi(ab)=ab\prod\limits_{i=1}^{k}(1-\dfrac{1}{p_i})\prod\limits_{j=1}^{l}(1-\dfrac{1}{q_i})=a\prod\limits_{i=1}^{k}(1-\dfrac{1}{p_i})\times b\prod\limits_{j=1}^{l}(1-\dfrac{1}{q_i})=\varphi(a)\varphi(b)\);
  4. 不完全积性:若 \(p\) 为质数,\(n\) 为 \(p\) 的倍数,则 \(n\) 与 \(np\) 的质因数种类上完全相同,有 \(\varphi(np)=np\prod\limits_{i=1}^{k}(1-\dfrac{1}{p_i})=n\prod\limits_{i=1}^{k}(1-\dfrac{1}{p_i})\times p=\varphi(n)\times p\);
  5. 若 \(n\) 为奇数,则 \(\varphi(2n)=\varphi(n)\),由方法 1,3 可推得。

结合方法 1,3,4,我们可以用线性筛的方法 \(O(n)\) 的计算 \(\varphi(i)\),实现如下:

for (int i = 2; i <= n; i++) {
    if (!isNotPrime[i]) {
        primes.push_back(i);
        phi[i] = i - 1; // 方法 1
    }
    for (int j = 0; j < primes.size() && i * primes[j] > n; j++) {
        isNotPrime[i * primes[j]] = true;
        if (i % primes[j] == 0) {
            phi[i * primes[j]] = phi[i] * primes[j]; // 方法 4
            break; // 线性筛原理:只让合数被「最小」质因数筛掉
        }
        phi[i * primes[j]] = phi[i] * phi[primes[j]]; // 方法 3
    }
}

THE END

标签:phi,limits,space,模版,bmod,varphi,P5091,prod,欧拉
From: https://www.cnblogs.com/th19/p/17917489.html

相关文章

  • 【模版】冒泡排序
    刚学C++时书上就会写这个qwq属于最简单的排序算法惹。算法步骤比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对......
  • 【模版】选择排序
    选择排序(Selectionsort)是一种简单直观的排序算法。1.基本思想首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的思想其实和冒泡排序有点类似,都......
  • 【模版】计数排序
    引入:P1271【深基9.例1】选举学生会在实际中,一般会在投票区放n个投票箱,投完后只需要计数每个投票箱即可。就此可引入计数排序。本题AC代码(虽然这题直接sort就行了...)#include<iostream>usingnamespacestd;inta[1010]={0},n,m,tmp;intmain(){cin>>n>>m;for......
  • 【模版】归并排序
    归并排序,它有两大核心操作.一个是将数组一分为二,一个无序的数组成为两个数组。另外一个操作就是,合二为一,将两个有序数组合并成为一个有序数组。时间复杂度情况:最好和最快情况都是:O(NlogN)代码模版如下intarr[N],temp[N];voidmerge_sort(intarr[],intl,intr......
  • 【模版】快速排序
    快速排序基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。算法复杂度最差时间复杂度O(N2)平均时间复杂度O(Nl......
  • 【算法模版】二分查找
    1.简介故事分享......
  • 欧拉线性筛
    模板#include<bits/stdc++.h>usingnamespacestd;constintN=1e8+10;intp[N];bitset<N>vis;intn;voidola(){ intcnt=0; for(inti=2;i<=N;i++){ if(!vis[i])p[++cnt]=i; for(intj=1;j<=cnt;j++){ if(i*p[j]>N)break; vis[i*p[j]......
  • c++11 乱模版
    std::is_same,std::enable_if,std::is_integraltemplate<typenameT>boolisZero(Tv){if(std::is_same<T,float>::value){return(fabs(v)<FLT_EPSILON);}elseif(std::is_same<T,double>::value){......
  • JDBC工具类模版
    packageJavaEndWork;importjava.beans.Statement;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.Properties;importjavax.sql.DataSource;importorg.slf4j.LoggerFactory;importorg.slf4j.Logger;importcom.a......
  • 亲情的欧拉定理
    欧拉定理指出产量分配净尽定理,指在完全竞争的条件下,假设长期中规模收益不变,则全部产品正好足够分配给各个要素。白话版如果总量不变的前提下产出的产品正好足够分配给各个要素增加了要素每个要素就会减少生产硬件不更新,本质不变化,分配不是无限的亲情人的的爱总量是......