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