HDU1286

来源:互联网 发布:java递归遍历二叉树 编辑:程序博客网 时间:2024/05/04 15:06

找新朋友

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3528 Accepted Submission(s): 1622 
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
22560824027
 
Sample Output
768016016


用GCD会超时,所以选择欧拉函数去做


#include<stdio.h>#include<string.h>int phi[33000];int gphi(){int i, j;memset(phi, 0, sizeof(phi));phi[1] = 1;for (i = 2; i<33000; i++)if (!phi[i])for (j = i; j<33000; j += i){if (!phi[j])phi[j] = j;phi[j] = phi[j] / i*(i - 1);}}int main(){int cn, n;gphi();scanf("%d", &cn);while (cn--&&scanf("%d", &n))printf("%d\n", phi[n]);return 0;}


0 0