杭電1286 尤拉函式 找新朋友

2021-09-11 01:17:40 字數 1654 閱讀 6750

新年快到了,「豬頭幫協會」準備搞乙個聚會,已經知道現有會員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...