欧拉函数:φ(n)表示从1~n-1中有多少个数与n互素。
① N是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)
② 除了N=2,φ(N)都是偶数.
③ 小于N且与N互质的所有数的和是φ(n)*n/2。
④ 欧拉函数是积性函数——若m,n互质,φ(m*n)=φ(m)*φ(n)。
⑤ 当N为奇数时,φ(2*N)=φ(N)
⑥ 若N是质数p的k次幂,φ(N)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟N互质。
p的倍数有p^k-1个
⑦ 当N是质数时,φ(N) = N-1
求一个数的欧拉函数 源程序
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define rg register ll
#define inf 2147483647
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define ll long long
#define maxn 2000000
const double eps=1e-8;
using namespace std;
inline ll read()
{
char ch=getchar();ll s=0,w=1;
while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}
while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
return s*w;
}
inline void write(ll x)
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+48);
}
ll n;
ll prime[maxn],visit[maxn],phi[maxn],tot;
inline void work()
{
phi[1]=1;
for(rg i=2;i<=n;i++)
{
if(!visit[i])
{
phi[i]=i-1;
prime[++tot]=i;
}
for(rg j=1;j<=tot;j++)
{
ll k=prime[j]*i;
if(k>maxn)break;
visit[k]=1;
if(i%prime[j]==0)
{
phi[k]=prime[j]*phi[i];
}
else phi[k]=phi[i]*(j-1);
}
}
cout<<phi[n]<<endl;
}
int main()
{
n=read();
work();
return 0;
}