首页 > 代码库 > HDU - 1286 找新朋友(欧拉函数)解题

HDU - 1286 找新朋友(欧拉函数)解题

                        找新朋友

                                 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
                                      Total Submission(s): 13024    Accepted Submission(s): 6941


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
 
这个题是欧拉函数的一个模板题。
这个是欧拉函数的模板:
 1 int eular(int n)
 2 {
 3     int ret=1,i;
 4     for(i=2;i*i<=n;i++)
 5     {
 6         if(n%i==0)
 7         {
 8             n/=i,ret*=i-1;
 9             while(n%i==0)
10             {
11                 n/=i,ret*=i;
12             }
13         }
14     }
15     if(n>1) ret*=n-1;
16     return ret;

 

这道题的题解:

 1 #include<stdio.h>
 2 int eular(int n)
 3 {
 4     int ret=1,i;
 5     for(i=2;i*i<=n;i++)
 6     {
 7         if(n%i==0)
 8         {
 9             n/=i,ret*=i-1;
10             while(n%i==0)
11             {
12                 n/=i,ret*=i;
13             }
14         }
15     }
16     if(n>1) ret*=n-1;
17     return ret;
18 }
19 int main ()
20 {
21     int a,n,s;
22     scanf("%d",&a);
23     while(a--)
24     {
25         scanf("%d",&n);
26         s=eular(n);
27         printf("%d\n",s);
28     }
29     return 0;
30 }

 

HDU - 1286 找新朋友(欧拉函数)解题