LeetCode 109 有序連結串列轉換二叉搜尋樹
阿新 • • 發佈:2020-08-18
定義:正整數n, 1到n-1中與n互質的數的個數為x, 尤拉函式值phi[n]=x。
如果n為質數,phi[n]=n-1。(因為對於質數n,它的因子只有1和它本身,1和n互質。所以n之前的數都和它互質
性質:
1, m和n互質 那麼phi[m*n]=phi[m]*phi[n]
2,費馬小定理(i為質數)
n為i的倍數時 phi[n*i]=phi[n]*i;
n不為i的倍數時 phi[n*i]=phi[n]*(i-1)
3, 1==n%2時,phi[2*n]=phi[n]
n為奇數
4,設小於n的與n互質的數的總和為S, 那麼S=phi[n]*n/2
因為當x和p互質的時候,p-x和p也是互質的
模板
1 const int mx=1e5+10; 2 ll euler(ll n){ 3 ll res=n; 4 for(ll i=2;i*i<=n;i++){ 5 if(!n%i){//n是i的倍數 不互質 要去掉 6 res-=res/i;//去掉i和i的倍數個數 7 while(!n%i) n/=i;//n相應的不再考慮i和i倍數 8 } 9 } 10 return (n-1)?res-res/n :res; 11 } 12 ll phi[mx]; 13 void euler(){14 phi[1]=1; 15 for(ll i=2;i<mx;i++){ 16 if(!phi[i])// 尤拉值沒有計算過不是前面的數的倍數-質數 只篩質數 17 for(ll j=i;j<mx;j+=i){//i的倍數 18 if(!phi[i]) phi[j]=j;//假設前面所有數字都和j互質 19 phi[j]-=phi[j]/i;//先去掉i的倍數 20 } 21 } 22 }