HDU1286 找新朋友(歐拉函數)

Problem Description
新年快到了,“豬頭幫協會”準備搞一個聚會,已經知道現有會員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 <cstdio>
const int maxn=32768+10;
int phi[maxn];

void phi_table(int n,int* phi){
    for(int i=2;i<=n;i++) phi[i]=0;
    phi[1]=1;
    for(int i=2;i<=n;i++) if(!phi[i])
        for(int j=i;j<=n;j+=i){
            if(!phi[j]) phi[j]=j;
            phi[j]=phi[j]/i*(i-1);
        }
}

int main(){
    phi_table(maxn,phi);
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        printf("%d\n",phi[n]);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章