zoukankan      html  css  js  c++  java
  • [ACM] hdu 1286 找新朋友(欧拉函数)

    找新朋友

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


    Problem Description

     

    新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。

     


     

    Input

     

    第一行是测试数据的组数CN(Casenumber,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。

     


     

    Output

     

    对于每一个N,输出一行新朋友的人数,这样共有CN行输出。

     


     

    Sample Input

     

    2

    25608

    24027

     


     

    Sample Output

     

    7680

    16016

     


     

    Author

     

    SmallBeer(CML)

     


     

    Source

     

    杭电ACM集训队训练赛(VII

     

    题解:

    数论,对正整数n欧拉函数是少于或等于n的数中与n互质的数的数目。

    φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pnx的所有质因数,x是不为0的整数。φ(1)=1

    代码:

    方法一:求单个phi(n)是多少

    #include <iostream>

    #include <cmath>

    using namespace std;

     

    const int maxn=32768;

     

    int phi(int n)//求phi(n)

    {

        int m=(int)sqrt(n+0.5);

        int ans=n;

        for(int i=2;i<=m;i++)

            if(n%i==0)

        {

            ans=ans/i*(i-1);

            while(n%i==0)

                n/=i;

        }

        if(n>1)

            ans=ans/n*(n-1);

        return ans;

    }

     

    int main()

    {

        int c;cin>>c;

        int n;

        while(c--)

        {

            cin>>n;

            cout<<phi(n)<<endl;

        }

        return 0;

    }


    方法二:求出欧拉函数表

    代码:

    #include <iostream>

    using namespace std;

     

    const int maxn=32768;

    int phi[maxn];

     

    void phi_table(int n)

    {

        for(int i=2;i<=n;i++)

            phi[i]=0;

        phi[1]=1;

        for(int i=2;i<=n;i++)

            if(!phi[i])

            for(int j=i;j<=n;j+=i)

        {

            if(!phi[j])

                phi[j]=j;

            phi[j]=phi[j]/i*(i-1);

        }

    }

     

    int main()

    {

        phi_table(maxn);

        int c;cin>>c;

        int n;

        while(c--)

        {

            cin>>n;

            cout<<phi[n]<<endl;

        }

        return 0;

    }


     

  • 相关阅读:
    ios 一个正则表达式测试(只可输入中文、字母和数字)
    IOS7 8中tableview分割线缺少15像素
    Java中使用OpenSSL生成的RSA公私钥进行数据加解密
    java与IOS之间的RSA加解密
    ios下使用rsa算法与php进行加解密通讯
    C# 32位md5
    [原]命令模式在MVC框架中的应用
    [原]【推荐】程序员必读的三十本经典巨作
    [原]容器学习(二):动手模拟AOP
    [原]容器学习(一):动手模拟spring的IoC
  • 原文地址:https://www.cnblogs.com/vivider/p/3697683.html
Copyright © 2011-2022 走看看