欧拉函数:
: 表示小于等于n且与n互质的正整数的个数。
拓展:小于等于n且与n互质的正整数的和 = (n>1) 。(n=1时值为1)
性质:
1.
若p为质数:
= p-1 ; (一个数为质数,那么小于等于它的数中只有它本身与它不互质)
若 i % p ==0 =>即 i与p不互质, 。
若 i % p !=0 =>即 i与p互质, 。
设 n = , 。
2.
若a,b互质,那么 。
3.
若n为奇数, 。
若n为偶数, 。
4.
5 (important) .
=>
6.
求:
1. 打表:
int prime[maxn],phi[maxn];
int cnt=0;
bool flag[maxn];
void get_phi(){
memset(flag,false,sizeof(flag));
phi[1]=1;
for(int i=2;i<maxn;i++){
if(!flag[i]){
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;i*prime[j]<maxn;j++){
flag[i*prime[j]]=true;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
2.非打表:
int phi(int n){
int ans=1;
for(int i=2;i*i<=n;i++){ // 可以的话这里换成质数表更佳
if(n%i==0){
n/=i;
ans*=i-1;
while(n%i==0){
n/=i;
ans*=i;
}
}
}
if(n>1) ans*=n-1;
return ans;
}
应用:
1.
2.
3.
证:
结论:若a与b互质,则a与(a+b)互质,b也与(a+b)互质。反之亦然。
反证法:
=> 设a与(a+b)不互质,那么设gcd(a,a+b)=t,则a=t*x,a+b=t*y,得b=t*(y-x),这与a与b互质的条件矛盾,因此a与(a+b)互质。
<= 设a与b不互质,那么设gcd(a,b)=t,则a=t*x,b=t*y,得a+b=t*(x+y),这与a与(a+b)互质的条件矛盾,因此a与b互质。
由 i 与 2n-i 互质可以推得,i 与 2n 互质,若,那么原式 = 。
现在,由上述结论可知,若 i 与 2n互质,那么 (2n-i) 与 2n 也互质,因此与 2n 互质的数的个数在 [1,n-1] 与 [n,2n-1] 里是相等的。
原式 = (i是>=1的正整数)
特别的,当 i=1 时,原式 = 0 。
4.
证:
若 [d|n] = 0,那么等式 = 0,对结果没有贡献,所以只需考虑 [d|n] = 1 的情况即可。
原式
d的取值与 i 无关
累加的顺序可以调换
原式 .
code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll phi(ll m){
ll ans=1;
for(ll i=2;i*i<=m;i++){
if(m%i==0){
m/=i;
ans*=i-1;
while(m%i==0){
m/=i;
ans*=i;
}
}
}
if(m>1) ans*=m-1;
return ans;
}
int main()
{
scanf("%lld",&n);
ll ans=0;
for(int i=1;i*i<=n;i++){
if(n%i==0){
ll k=n/i;
ans+=phi(i)*k;
if(k!=i)
ans+=phi(k)*i;
}
}
printf("%lld\n",ans);
return 0;
}