zoukankan      html  css  js  c++  java
  • 欧拉函数

    运用线性筛

    //若p是x的约数,则E(x*p)=E(x)*p.
    //若p不是x的约数,则E(x*p)=E(x)*E(p)=E(x)*(p-1). 
    #include<iostream>  
    #include<string>  
    #include<cstring>  
    using namespace std;  
    const int MAXN=3000001;  
    int prime[MAXN];//保存素数   
    bool vis[MAXN];//初始化   
    int phi[MAXN];//欧拉函数   
    void Prime(int n)  
    {  
        int cnt=0;  
        memset(vis,0,sizeof(vis));  
        for(int i=2;i<n;i++)  
        {  
            if(!vis[i])  
            {  
                prime[cnt++]=i;  
                phi[i]=i-1;// if p is prime,then phi[i]=i-1  
            }  
            for(int j=0;j<cnt&&i*prime[j]<n;j++)  
            {  
                __int64 k=i*prime[j];  
                vis[k]=1;  
                if(i%prime[j]==0)//关键   
                {  
                    phi[k]=phi[i]*prime[j];  
                    break;  
                }  
                else  
                phi[k]=phi[i]*(prime[j]-1);  
    
            }  
        }  
    }  
    int main()  
    {  
        int a,b;  
        Prime(3000000);  
        while(cin>>a>>b)  
        {  
            __int64 ans=0;  
            for(int i=a;i<=b;i++)  
            ans+=phi[i];  
            cout<<ans<<endl;  
        }  
    }  

    例题:HDU3501
    题目大意:给你一个N,求小于等于N的不互质的数的总和。
    欧拉公式的引伸:小于或等于n的数中,与n互质的数的总和为:φ(x) * x / 2。(n>1)
    所以:res = n*(n-1)/2-n - phi[x]*x/2。

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    typedef long long LL;
    
    int eular(LL n)     //欧拉函数
    {
        int i, ans = n;
        for(i = 2; i * i <= n; i++)
        {
            if(n%i == 0)
            {
                ans -= ans/i;
                while(n%i == 0)
                    n /= i;
            }
        }
        if(n > 1) ans -= ans/n;
    
        return ans;
    }
    
    int main()
    {
        LL n, ans;
        while(scanf("%lld", &n), n)
        {
            ans = n * (n+1) / 2 - n;    //总和
            ans -= eular(n) * n / 2;    //减去互质的总和公式
            ans %= 1000000007;          //再取模
            printf("%lld
    ", ans);
        }
    
        return 0;
    }
    版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
  • 相关阅读:
    包含深度学习常用框架的Docker环境
    Docker快速搭建neural style环境
    kaggle之Grupo Bimbo Inventory Demand
    kaggle之人脸特征识别
    kaggle之识别谷歌街景图片中的字母
    kaggle之数字序列预测
    kaggle之泰坦尼克的沉没
    kaggle之手写体识别
    Promise/Bluebird源码
    redis源码笔记(一) —— 从redis的启动到command的分发
  • 原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9248054.html
Copyright © 2011-2022 走看看