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 }
欧拉定理
若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 }
同样还有递归的快速幂算法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人