數論——歐拉函數
阿新 • • 發佈:2019-04-26
int span 函數應用 應用 mda 題目 phi def mar
歐拉函數:
對正整數n,歐拉函數是小於等於n的正整數中與n互質的數的數目(φ(1)=1)。
性質:
- 歐拉函數是積性函數——若m,n互質,φ(mn)=φ(m)φ(n)
- 當n為奇數,φ(2n)=φ(n)
- 若n為質數,φ(n)=n-1
代碼:
int euler(int n) { int res=n,m=sqrt(n+0.5); for(int i=2;i<=m&&n!=1;++i) { if(n%i==0) { res=res/i*(i-1); while(n%i==0) n/=i; } } if(n!=1) res=res/n*(n-1); return res; }
歐拉函數應用:
題目鏈接:
https://cn.vjudge.net/problem/HDU-1787
代碼:
#include <cstdio> #include <math.h> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn=32768; int euler(int n) { int res=n,m=sqrt(n+0.5); for(int i=2;i<=m&&n!=1;++i) { if(n%i==0) { res=res/i*(i-1); while(n%i==0) n/=i; } } if(n!=1) res=res/n*(n-1); return res; } int main() { int n; while(scanf("%d",&n)&&n) printf("%d\n",n-1-euler(n)); return 0; }
數論——歐拉函數