HDU 1286 找新朋友 (欧拉公式或者标记法(其实就是欧拉公式的思想))

传送门:

http://acm.hdu.edu.cn/showproblem.php?pid=1286

找新朋友

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


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
 

 

Author
SmallBeer(CML)
 
分析:
欧拉公式(第一次接触)!
在数论,对正整数n,
欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。
 
方法1:正统的欧拉函数
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int eular(int n)//欧拉函数
{
    int ret=1,i;
    for(i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            n/=i,ret*=i-1;
            while(n%i==0) n/=i,ret*=i;
        }
    }
    if(n>1) ret*=n-1;
    return ret;
}
int main ()
{
    /*
    在数论,对正整数n,
    欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。
    */
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        printf("%d\n",eular(n));
    }
    return 0;
}

第二种方法:标记法(实际上还是欧拉函数的思想)

对于n(如25608),

用一个大小等于n的bool数组记录是不是新朋友。

找出它所有因子x,并且把x的倍数全标记为1.

最终标记为0的就是新朋友

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define max_v 32770
int main ()
{
    /*
    对于n(如25608),
    用一个大小等于n的bool数组记录是不是新朋友。
    找出它所有因子x,并且把x的倍数全标记为1.
    最终标记为0的就是新朋友
     */
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int a[n+1];
        memset(a,0,sizeof(a));
        for(int i=2;i<=n/2;i++)
        {
            if(n%i==0)
            {
                for(int j=i;j<n;j+=i)
                {
                    a[j]=1;
                }
            }
        }
        int c=0;
        for(int i=2;i<n;i++)
        {
            if(a[i]==0)
                c++;
        }
        printf("%d\n",c+1);
    }
    return 0;
}

 

 

 

posted @ 2018-07-17 21:57  西*风  阅读(284)  评论(0编辑  收藏  举报