• 欧拉函数(用欧拉筛法求欧拉函数)


    873. 欧拉函数

    给定 n

    个正整数 ai

    ,请你求出每个数的欧拉函数。

    欧拉函数的定义

    1∼N

    中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。
    若在算数基本定理中,N=pa11pa22…pamm,则:
    ϕ(N) = N×p1−1p1×p2−1p2×…×pm−1pm

    输入格式

    第一行包含整数 n

    接下来 n

    行,每行包含一个正整数 ai

    输出格式

    输出共 n

    行,每行输出一个正整数 ai

    的欧拉函数。

    数据范围

    1≤n≤100

    ,
    1≤ai≤2×109

    输入样例:

    1. 3
    2. 3
    3. 6
    4. 8

    输出样例:

    1. 2
    2. 2
    3. 4

     

     * 欧拉函数的定义
     * 1∼N中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。
     * 若在算数基本定理中,N=p1^e1*p2^e2*...*pk^ek;则:
     * phi(N)=N/p1*(p1-1)/p2*(p2-1)/.../pk*(pk-1);

    1. /**
    2. * 欧拉函数的定义
    3. * 1∼N中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。
    4. * 若在算数基本定理中,N=p1^e1*p2^e2*...*pk^ek;则:
    5. * phi(N)=N/p1*(p1-1)/p2*(p2-1)/.../pk*(pk-1);
    6. */
    7. #include
    8. #include
    9. using namespace std;
    10. int phi(int v)
    11. {
    12. int res=v;
    13. vector<int> vec;
    14. for(int i=2;i<= v/i;++i)
    15. {
    16. if(v%i==0)
    17. {
    18. vec.push_back(i);
    19. while(v%i==0)
    20. v/=i;
    21. }
    22. }
    23. if(v>1)
    24. vec.push_back(v);
    25. for(auto a:vec)
    26. res=res/a*(a-1);
    27. return res;
    28. }
    29. int main()
    30. {
    31. int n;
    32. cin >> n;
    33. while (n -- )
    34. {
    35. int v;
    36. cin >> v;
    37. cout << phi(v) << endl;
    38. }
    39. return 0;
    40. }

    874. 筛法求欧拉函数

    给定一个正整数 n

    ,求 1∼n

    中每个数的欧拉函数之和。

    输入格式

    共一行,包含一个整数 n

    输出格式

    共一行,包含一个整数,表示 1∼n

    中每个数的欧拉函数之和。

    数据范围

    1≤n≤106

    输入样例:

    6
    

    输出样例:

    12
    

    void get_phi(int v)
    {
        phi[1]=1;
        for(int i=2;i<=v;++i)
        {
            if(hs[i]==0)
            {
                p[num++]=i;
                phi[i]=i-1; //如果i是质数
            }
            
            for(int j=0;p[j]<=v/i;++j)
            {
                hs[p[j]*i]=1;
                if(i%p[j]==0)
                {
                    phi[p[j]*i]=phi[i] * p[j]; //如果p[j]是i的约数,那么p[j]一定是p[j]*i的约数
                    break;
                }
                else
                    phi[p[j]*i]=phi[i] * (p[j]-1); //如果p[j]不是i的约数,但是p[j]一定是p[j]*i 的约数
            }
        }
    }

    1. /**
    2. * 利用欧拉筛法求质数的过程求1——N的欧拉函数
    3. */
    4. #include
    5. #include
    6. using namespace std;
    7. typedef long long LL;
    8. const int maxn=1e6+10;
    9. int p[maxn],num=0,phi[maxn];
    10. bool hs[maxn];
    11. void get_phi(int v)
    12. {
    13. phi[1]=1;
    14. for(int i=2;i<=v;++i)
    15. {
    16. if(hs[i]==0)
    17. {
    18. p[num++]=i;
    19. phi[i]=i-1; //如果i是质数
    20. }
    21. for(int j=0;p[j]<=v/i;++j)
    22. {
    23. hs[p[j]*i]=1;
    24. if(i%p[j]==0)
    25. {
    26. phi[p[j]*i]=phi[i] * p[j]; //如果p[j]是i的约数,那么p[j]一定是p[j]*i的约数
    27. break;
    28. }
    29. else
    30. phi[p[j]*i]=phi[i] * (p[j]-1); //如果p[j]不是i的约数,但是p[j]一定是p[j]*i 的约数
    31. }
    32. }
    33. }
    34. int main()
    35. {
    36. int n;
    37. cin >> n;
    38. get_phi(n);
    39. LL res=0;
    40. for(int i=1;i<=n;++i)
    41. res+=phi[i];
    42. cout << res << endl;
    43. return 0;
    44. }

  • 相关阅读:
    SSO单点登录
    CAS:190598-55-1_Biotin sulfo-N-hydroxysuccinimide ester生物素化试
    故障分析 | MySQL 无监听端口故障排查
    一个Vue3数字框区间指令及其衍生的一个知识点
    glibc 2.23 源码分析 | malloc & free
    SQL之索引
    数据结构与算法——排序算法
    linux top命令按内存/CPU排序显示
    “医药分离”大背景下,连锁药店如何加速扩张
    大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS
  • 原文地址:https://blog.csdn.net/qq_51825761/article/details/126264748