利用欧拉函数求N的正约数的个数。(本代码中用num代替了题目给出的N)。找新朋友 |
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 <bits/stdc++.h> # include <stdio.h> # include <math.h> int main(){ int n, sum, num, bin; while (scanf ("%d", &n) != EOF){ for (int i = 0; i < n; i++){ scanf ("%d", &num); bin = (int)sqrt(num + 0.5); sum = num; for (int j = 2; j <= bin; j++)//在O(sqrt(n))的时间内求出一个数的欧拉函数值. if (num % j == 0){ sum = sum / j * (j - 1); while (num % j == 0) num /= j; } if (num > 1) sum = sum / num * (num - 1); printf("%d\n", sum); } } return 0; }