• 欧拉函数


      应上帝的要求,打了一遍欧拉筛素数的模板(尽管没有两分钟完成,中途还错了一次....),但当我试图解释一下的时候,上帝已经沉浸在生活大爆炸中不能自拔,于是写下这篇博客,祭奠。

      我们知道一种常见的筛素数的方法,就是找到素数之后把这个素数的倍数全都标记为非素数,那问题是,有很多合数被标记了多次,这样就显得有些浪费时间,而欧拉筛就避免了这个问题,因为他对于每一个合数都只标记一遍。

      每一个合数都是素数的乘积,它恰好能被它的最小素数筛去一次,所以复杂度是O(n)的。

      具体解释出自:http://blog.csdn.net/nk_test/article/details/46242401

      代码中体现在:
      if(i%prime[j]==0)break;
      Prime数组 中的素数是递增的,当 i 能整除 Prime[j],那么 i*Prime[j+1] 这个合数肯定被 Prime[j] 乘以某个数筛掉。
      因为i中含有Prime[j], Prime[j] 比 Prime[j+1] 小。接下去的素数同理。所以不用筛下去了。
      在满足i%Prme[j]==0这个条件之前以及第一次满足改条件时,Prime[j]必定是Prime[j]*i的最小因子。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    using namespace std;
    int Prime[50];
    int n;
    bool f[50];
    int Num;
    void Euler()
    {
        int t=n;
        for (int i=2;i<=t;i++)
        {
            if (!f[i])
              Prime[Num++]=i;
            for (int j=0;j<Num&&i*Prime[j]<=t;j++)
            {
                f[i*Prime[j]]=true;
                if (!(i%Prime[j]))
                  break;
            }
        }
    }
    int main()
    {
        cin>>n;
        Euler();
        for(int i=0;i<Num;i++)
            cout<<Prime[i]<<" ";
    }

     

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    #define ll long long
    int n;
    int ans;
    int Euler(int n)
    {
         int res=n,a=n;    
         for(int i=2;i*i<=a;i++){    
             if(a%i==0){    
                 res=res/i*(i-1);
                 while(a%i==0) a/=i;    
             }    
         }     
         if(a>1) res=res/a*(a-1);    
         return res;
    }
    int main()
    {
        freopen("phi.in","r",stdin);
        freopen("phi.out","w",stdout);
        scanf("%d",&n);
        ans=Euler(n);
        printf("%d",ans);
        fclose(stdin);fclose(stdout);
        return 0;
        
    }

     

  • 相关阅读:
    hdoj:2075
    hdoj:2072
    hdoj:2071
    hdoj:2070
    hdoj:2069
    test001
    hdoj:2067
    hdoj:2061
    hdoj:2058
    hdoj:2057
  • 原文地址:https://www.cnblogs.com/xiaoningmeng/p/6044714.html
Copyright © 2020-2023  润新知