1. 程式人生 > 實用技巧 >LeetCode 109 有序連結串列轉換二叉搜尋樹

LeetCode 109 有序連結串列轉換二叉搜尋樹

定義:正整數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 }