欧拉与快速幂
欧拉函数
欧拉函数:求1~n之间有多少个数与n互质
ϕ
(
n
)
=
n
(
1
−
1
p
1
)
(
1
−
1
p
2
)
.
.
.
.
.
.
(
1
−
1
p
k
)
\phi (n) = n(1-\frac{1}{p_{1}})(1-\frac{1}{p_{2}})......(1-\frac{1}{p_{k}})
ϕ(n)=n(1−p11)(1−p21)......(1−pk1)
其中
P
k
P_{k}
Pk代表n的质因数 。
#include <iostream>
using namespace std ;
const int N = 105 ;
int p[N];
int main(){
int n ;
cin >> n ;
while(n -- ) {
int a ;
cin >> a ;
int cnt = 0 ;
int res = a ;
for(int i = 2 ; i <= a/i ; i ++){
if(a % i == 0) p[++cnt] = i ;
while(a % i == 0){
a /= i ;
}
}
if(a > 1) p[++cnt] = a ;
for(int i = 1 ; i <= cnt ; i ++ ){
res = res / p[i] * (p[i] - 1) ;
}
cout << res << endl ;
}
return 0 ;
}
欧拉函数线性筛
void euler(int n){
phi[1] = 1 ;
for(int i = 2 ; i <= n ; i ++){
if(!vis[i]){
p[++cnt] = i ;
phi[i] = i - 1 ;
}
for(int j = 1 ; p[j] <= n/i ; j ++ ){
vis[p[j] * i] = true ;
if(i % p[j] == 0 ){
phi[p[j] * i] = phi[i] * p[j] ;
break ;
}
phi[p[j] * i] = phi[i] * (p[j] - 1 ) ;
}
}
}
欧拉定理
存在一个数a与b互质,则:
a
ϕ
(
b
)
≡
1
(
m
o
d
b
)
a^{ \phi (b)} \equiv 1 (mod\ b)
aϕ(b)≡1(mod b)
若b是质数,构成费马小定理:
a
b
−
1
≡
1
(
m
o
d
b
)
a^{b-1} \equiv 1 (mod\ b)
ab−1≡1(mod b)
快速幂
ll qmi(int a, int k ,int p){
ll res = 1 ;
while(k){
if(k&1) res = ((ll)res * a) % p ;
k >>= 1 ;
a = ((ll)a * a % p ) % p ;
}
return res ;
}
快速幂求逆元
乘法逆元的定义:
若整数 b b b,m 互质,并且对于任意的整数 a a a,如果满足 b ∣ a b|a b∣a,则存在一个整数 x x x,使得 a / b ≡ a × x ( m o d m ) a/b≡a×x(mod\ m) a/b≡a×x(mod m),则称 x 为 b 的模 m 乘法逆元,记为 b − 1 ( m o d m ) b^{-1}(mod\ m) b−1(mod m)。
b 存在乘法逆元的充要条件是 b 与模数 m 互质。
有乘法逆元定义和费马小定理可知,当b 与模数 m 互质且 m 是质数时,满足:
b
−
1
=
b
m
−
2
b^{-1} = b^{m-2}
b−1=bm−2