新年快到了,「豬頭幫協會」準備搞乙個聚會,已經知道現有會員n人,把會員從1到n編號,其中會長的號碼是n號,凡是和會長是老朋友的,那麼該會員的號碼肯定和n有大於1的公約數,否則都是新朋友,現在會長想知道究竟有幾個新朋友?請你程式設計序幫會長計算出來。
input
第一行是測試資料的組數cn(case number,1sample input
225608
24027
sample output
7680
16016
補充尤拉函式:
在數論,對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目.如:φ(1)=1此函式以其首名研究者尤拉命名(euler』s totient function),它又稱為euler』s totient function、φ函式、尤拉商數等。例如φ(8)=4,因為1,3,5,7均和8互質。
互質:
互質是公約數只有1的兩個整數,叫做互質整數。
看到這有沒有發現 題目的意思就是讓我們求 1——n-1 中與 n 互質的數的總數,自然就轉化為求 φ(n)的值。
尤拉函式的c語言**:
以兩個等式為基礎編寫的**
n = p1 ^ q1 * p2 ^ q2 * … * pn ^ qn.
φ(n) = n * (1-1/p1) * (1-1/p2) * … * (1-1/pn)
只和底數有關,和指數無關
10 = 1 × 2 × 5
ψ(10)=10×(1-1/2)×(1-1/5)=4;
30 = 1 × 2 × 3 × 5
ψ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;
8 = 2^3
ψ(8)=8×(1-1/2 ) =4;
#include#includeint eular(int n)
}if (n > 1) //最後乙個因數(也是最大的因數) 可能不符合迴圈條件而跳出迴圈,這裡將其捕獲。
ans = ans * (n - 1) / n;
return ans;
}int main ()
``
解題**一
尤拉函式
#include#include #include #include#includeint eular(int n)
}if (n > 1)
ans = ans * (n - 1) / n;
return ans;
}int main()
return 0;
}
解題**二:
用空間換時間
#include#include #include #include#includeint a[33000]; //定義乙個很大的陣列
using namespace std;
int main()
}for (i=1;iprintf("%d\n",sum);
}return 0;
}
hdu 1286 找新朋友(尤拉函式)
一道赤裸裸的尤拉函式題!原來只知道尤拉這個人 真是頭髮短見識更短,慚愧,以後課下還是要了解一些其他方面的知識 嘿嘿 用了尤拉函式!這就是一道水題嗎 呵呵呵 附上尤拉函式的講解 在數論 對正整數 n,尤拉 函式是少於或等於n的數中與n 互質的數的數目。此函式以其首名研究者尤拉命名,它又稱為euler ...
HDU 1286 找新朋友 尤拉函式
題意 中文 就是求小於等於n的數中有多少個和n互質 即尤拉函式值 div i 表示i的最小質因數 eul i 儲存i的尤拉函式值 求尤拉函式的方法 1.eul 1 1 2.若i p k p是素數 eul i p 1 p k 1 3.若m,n互質,eul m n eul m eul n 可以推出尤拉函...
HDU 1286 找新朋友(尤拉函式)
思路 尤拉函式的簡單應用,建議先看本部落格演算法精講裡面關於尤拉函式的介紹 ac 1 include include using namespace std int main printf d n rea return 0 錯誤 include include using namespace std...