欧拉函数
定义:小于或等于n的正整数中与n互质的数的数目,例如:φ(8)=4,1,3,5,7与8互质。
通式:(其中p1, p2……pn为x的所有质因数,x是不为0的整数)
性质:
p为质数,m为大于0自然数
φ( p)=p-1
欧拉函数是积性函数——若m,n互质
if(m%p==0) φ(p*m) = φ(m)*p
else φ(p*m) = φ( p)*φ(m)
if(m&1) φ(2*m) = φ(m)
else if(m>2)φ(m)为偶数
φ(pm)=φ(pm)-φ(pm-1)
求和:
Σ
d
∣
n
=
n
Σ_{d|n}=n
Σd∣n=n
Σ
i
=
1
n
[
g
c
d
(
i
,
n
)
=
1
]
=
φ
(
n
)
Σ^{n}_{i=1}[gcd(i,n)=1]=φ(n)
Σi=1n[gcd(i,n)=1]=φ(n)
Σ
i
=
1
n
i
[
g
c
d
(
i
,
n
)
=
1
]
=
⌈
φ
(
n
)
∗
n
2
⌉
Σ^{n}_{i=1}i[gcd(i,n)=1]=⌈\frac {φ(n)*n}{2}⌉
Σi=1ni[gcd(i,n)=1]=⌈2φ(n)∗n⌉
麻瓜(我)的求法:
int gtpi(int n){
int res=1;
for(int i=2;i<n;i++)
if(__gcd(i,n) == 1)res++;
return res;
}
O(sqrt(n))求φ(n):
int phi(int n){
//if(n==0)return 0;
int res=n,tmp=n;
for(int i=2;i*i<=tmp;i++){
if(tmp%i==0){
res=res/i*(i-1);
while(tmp%i==0)tmp/=i;
}
}
if(tmp>1)res=res/tmp*(tmp-1);
return res;
}
O(n)求1~n所有数的欧拉函数:
const int N;
int prime[N],cnt;
int phi[N];
bool vis[N];
void Get_phi(int n){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){
prime[cnt++]=i;
phi[i]=i-1;//性质1
}
for(int j=0;prime[j]<=n/i;j++){
int t=prime[j]*i;
vis[t]=1;
if(i%prime[j]==0){
phi[t]=phi[i]*prime[j];//性质2
break;
}
phi[t]=phi[i]*(prime[j]-1);//性质2
}
}
}
欧拉定理
定义:
欧拉定理(Euler Theorem,也称费马-欧拉定理或欧拉函数定理)是一个关于同余的性质。
内容:
若n,a为正整数,且n,a互质,则:
a
ϕ
(
n
)
≡
1
(
m
o
d
n
)
a ^{\phi(n)} \equiv 1(mod\;n)
aϕ(n)≡1(modn)
费马小定理:
若n,a为正整数,且n为质数,则:
a
ϕ
(
n
)
≡
1
(
m
o
d
n
)
>
>
a
n
−
1
≡
1
(
m
o
d
n
)
a ^{\phi(n)} \equiv 1(mod\;n)\;>>\;a ^{n-1} \equiv 1(mod\;n)
aϕ(n)≡1(modn)>>an−1≡1(modn)
逆元:
a
ϕ
(
n
)
−
1
a^{\phi(n)-1}
aϕ(n)−1
证明:
设x(1),x(2),…,x(φ(n))是一个以n为模的缩系,
则ax(1),ax(2),…,ax(φ(n) )也是一个以n为模的缩系(因为(a,n)=1)。
于是有ax(1)ax(2)…ax(φ(n) )≡x(1)x(2)…x(φ(n))(mod n),
所以a^φ(n) ≡ 1 (mod n)。证毕。
欧拉降幂
显然:
a
b
≡
{
a
b
%
ϕ
(
p
)
if
g
c
d
(
a
,
p
)
=
1
a
b
if
g
c
d
(
a
,
p
)
≠
1
,
b
<
ϕ
(
p
)
(
m
o
d
p
)
a
b
%
ϕ
(
p
)
+
ϕ
(
p
)
if
g
c
d
(
a
,
p
)
≠
1
,
b
>
=
ϕ
(
p
)
a^b \equiv \begin{cases} a^{b\%\phi(p)} &\text{if } gcd(a,p)=1 \\ a^b &\text{if } gcd(a,p)\not=1,b<\phi(p) &\text{ }(mod\;p)\\ a^{b\%\phi(p)+\phi(p)} &\text {if }gcd(a,p)\not=1 ,b>=\phi(p) \end{cases}
ab≡⎩⎪⎨⎪⎧ab%ϕ(p)abab%ϕ(p)+ϕ(p)if gcd(a,p)=1if gcd(a,p)=1,b<ϕ(p)if gcd(a,p)=1,b>=ϕ(p) (modp)
然后就可以愉快地做题了
例如: 牛客的
简单数据结构1
Ternary String
子序列
[SDOI2008]仪仗队洛谷也有一样的 ,但好像数据不太一样