AcWing算法基础课 欧拉函数、快速幂

1、欧拉函数的定义是,φ(n)是1-n中与n互质的数的个数

对n分解质因数得p1^a1*p2^a2*...*pn^an,

则φ(n)=n*(1-1/p1)(1-1/p2)*...*(1-1/pn);

对多个数求欧拉函数,可以结合线性筛法,对每个质数和被筛到的数,都根据已经被循环到的数的φ计算

复制代码
 1 const int N = 100010;
 2 int primes[N], cnt;
 3 int phi[N];//全部欧拉函数
 4 bool not_prime[N];//是否为质数
 5 typedef long long LL;
 6 
 7 LL get_eulers(int n)//求1-n全部欧拉函数的和
 8 {
 9     phi[1] = 1;
10     for (int i = 2; i <= n; i++)
11     {
12         if (!not_prime[i])
13         {
14             primes[cnt++] = i;
15             phi[i] = i - 1;//质数的欧拉函数
16         }
17         for (int j = 0; primes[j] <= n / i; j++)
18         {
19             not_prime[primes[j] * i] = true;
20             if (i%primes[j] == 0)
21             {
22                 phi[primes[j] * i] = phi[i] * primes[j]; //primes[j] * i的最小质因子为primes[j],且primes[j]是i的质因子
23                 break;
24             }
25             phi[primes[j] * i] = phi[i] * (primes[j] - 1);
26             //primes[j] * i的最小质因子为primes[j],且primes[j]不是i的质因子(primes[j]-1)=primes[j]*(1-1/primes[j])
27         }
28 
29     }
30     LL res = 0;
31     res = accumulate(phi + 1, phi + n + 1, 0LL);
32     return res;
33 }
View Code
复制代码

欧拉定理

若a与n互质,则有 (a^φ(n))%n=1;

2、快速幂

对a^k,可以预处理出,a^(2^0),a^(2^1)...,a^(2^n),其中a^(2^(n+1))>k,a^(2^(n))≤k。其中a^(2^(i+1))=(a^(2^i))^2,O(logn)

则k=x0*(2^0)+x1*(2^1)+...+xn*(2^n),其中xi为k的二进制表示的第i位,取0或1

则a^k=a^(x0*(2^0))*a^(x1*(2^1))*...*a^(xn*(2^n)),O(logn)。

算法结果取模则每步预处理也取模。

复制代码
 1 int qmi(int a, int k, int p)//(a^k)%p
 2 {
 3     int res=1;
 4     while (k)
 5     {
 6         if (k & 1) res = (LL)(res*a) % p;//a初始为a^(2^0)=a
 7         k >> 1;
 8         a = (LL)a*a%p;
 9     }
10     return res;
11 }
View Code
复制代码

同样还有递归的快速幂算法。

 

posted @   80k  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示