歐拉--HDU - 1286

https://cn.vjudge.net/contest/174897#problem/H

新年快到了,“豬頭幫協會”準備搞一個聚會,已經知道現有會員N人,把會員從1到N編號,其中會長的號碼是N號,凡是和會長是老朋友的,那麼該會員的號碼肯定和N有大於1的公約數,否則都是新朋友,現在會長想知道究竟有幾個新朋友?請你編程序幫會長計算出來。
Input第一行是測試數據的組數CN(Case number,1<CN<10000),接着有CN行正整數N(1<n<32768),表示會員人數。 Output對於每一個N,輸出一行新朋友的人數,這樣共有CN行輸出。 
Sample Input
2
25608
24027
Sample Output
7680
16016

解析:直接求最大公倍數超時,所以用歐拉函數。


#include<stdio.h>
#include<math.h>
int Eular(int n)
{
	int ans=1;
	for(int i=2;i<=sqrt((double)n);i++){
		if(n%i==0){
			n/=i;
			ans*=(i-1);
			while(n%i==0){
				n/=i;
				ans*=i;
			}
		}
	}
	if(n>1) ans*=(n-1);
	return ans;
}
int main()
{
	int u;
	int n;
	int ans;
	scanf("%d",&u);
	while(u--){
		scanf("%d",&n);
		ans=Eular(n);
		printf("%d\n",ans);
	}
	return 0;
}







發佈了27 篇原創文章 · 獲贊 1 · 訪問量 3556
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章