码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-07-19 14:19:06      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:mit   tle   strong   i++   amp   include   iss   ssi   input   

                        找新朋友

                                 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 找新朋友(欧拉函数)解题

标签:mit   tle   strong   i++   amp   include   iss   ssi   input   

原文地址:http://www.cnblogs.com/lyf0031/p/7204711.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!