HDU1286 找新朋友 尤拉函式

2021-07-09 03:08:52 字數 1604 閱讀 9715

新年快到了,「豬頭幫協會」準備搞乙個聚會,已經知道現有會員n人,把會員從1到n編號,其中會長的號碼是n號,凡是和會長是老朋友的,那麼該會員的號碼肯定和n有大於1的公約數,否則都是新朋友,現在會長想知道究竟有幾個新朋友?請你程式設計序幫會長計算出來。

第一行是測試資料的組數cn(case number,1對於每乙個n,輸出一行新朋友的人數,這樣共有cn行輸出。

2 25608

24027

7680

16016

**一:

/*

*定義:對於正整數n,φ(n)是小於或等於n的正整數中,與n互質的數的數目。

*    例如:φ(8)=4,因為1,3,5,7均和8互質。

*性質:1.若p是質數,φ(p)= p-1.

*   2.若n是質數p的k次冪,φ(n)=(p-1)*p^(k-1)。因為除了p的倍數都與n互質

*   3.尤拉函式是積性函式,若m,n互質,φ(mn)= φ(m)φ(n).

*  根據這3條性質我們就可以推出乙個整數的尤拉函式的公式。因為乙個數總可以寫成一些質數的乘積的形式。

*  e(k)=(p1-1)(p2-1)...(pi-1)*(p1^(a1-1))(p2^(a2-1))...(pi^(ai-1))

*    = k*(p1-1)(p2-1)...(pi-1)/(p1*p2*...*pi)

*    = k*(1-1/p1)*(1-1/p2)...(1-1/pk)

*在程式中利用尤拉函式如下性質,可以快速求出尤拉函式的值(a為n的質因數)

*  若( n%a ==0&&(n/a)%a ==0)則有:e(n)= e(n/a)*a;

*  若( n%a ==0&&(n/a)%a !=0)則有:e(n)= e(n/a)*(a-1);

*/#include

#include

#include

#include

#include

#include

#include

#include

#define n 100010

using namespace std;

int num[40000];

int eular(int x)}}

if(x > 1)

ans *= x - 1;

return ans;

}int main()

return

0;}

**二:

#include 

#include

#include

#include

#include

#include

#include

#include

#define n 100010

using

namespace

std;

int num[40000];

int main()

}for (i = 1; i <= n; i++)

cout

<< n-ans << endl;

}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...