算法基础之筛法求欧拉函数

2023-12-21 20:31:10

筛法求欧拉函数

  • 核心思想 :线性筛法 筛的过程中顺便求欧拉函数

    • 第一种情况 (i % prime[j] == 0)

      • 在这里插入图片描述
    • 第二种情况 (i % prime[j] != 0)

      • 在这里插入图片描述
    •   #include<iostream>
        #include<algorithm>
        
        using namespace std;
        typedef long long LL;
        const int N = 1000010;
        
        int prime[N],cnt;
        bool st[N];
        int euler[N];  //欧拉函数
        
        void get_euler(int n)
        {
            euler[1] = 1;
            for(int i =2;i<= n;i++)
            {
                if(!st[i]) 
                {
                    prime[cnt++] = i;
                    euler[i] = i-1;  //如果是质数 互质的数就是1~i-1
                }
                for(int j=0;prime[j]<= n/i;j++)
                {
                    int t = prime[j] *i;
                    st[t] = true;
                    if(i % prime[j] == 0)  //第一种情况
                    {
                        euler[t] = euler[i] * prime[j];
                        break;
                    }
                    euler[t] = euler[i] * (prime[j] - 1);  //第二种情况
                }
            }
        }
        
        int main()
        {
            int n;
            cin>>n;
            
            get_euler(n);
            
            LL res = 0;
            
            for(int i=1;i<=n;i++) res +=euler[i];
            
            cout<<res;
        }
      

文章来源:https://blog.csdn.net/Pisasama/article/details/135139088
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。