zoukankan      html  css  js  c++  java
  • 【模板】 素数、欧拉数、莫比乌斯函数小结

    二话不说上代码:(如果有错误欢迎指出)

    //By Menteur_Hxy
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    
    int rd() {
        int x=0,fla=1; char c=' ';
        while(c>'9'|| c<'0') {if(c=='-') fla=-fla; c=getchar();}
        while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
        return x*fla;
    }
    
    const int MAX=500010;
    const int INF=0x3f3f3f3f;
    int n;
    int vis[MAX],p[MAX],phi[MAX],mu[MAX]; 
    
    void getp1() { // 埃氏 
        int e=sqrt(n);
        for(int i=2;i<=e;++i)
            if(!vis[i])
                for(int j=i*i;j<=n;j+=i)
                    vis[j]=1;
    } 
    
    void euler1() { //筛欧拉数 
        for(int i=1;i<=n;i++) phi[i]=i;
        for(int i=2;i<=n;i++) {
            if(phi[i]==i) 
                for(int j=i;j<=n;j+=i) //必须从i开始 
                    phi[j]=phi[j]/i*(i-1);
        } 
    }
    
    void getp2() { //线性素数 
        int cnt=0;
        for(int i=2;i<=n;++i){
            if(!vis[i]) p[++cnt]=i;
            for(int j=1;j<=cnt && i*p[j]<=n;++j){
                vis[i*p[j]]=1;
                if(i%p[j]==0) break;
            }
        }
    }
    
    void euler2() { //线性欧拉数 
        int cnt=0;
        for(int i=2;i<=n;++i){
            if(!vis[i]) p[++cnt]=i,phi[i]=i-1;
            for(int j=1;j<=cnt && i*p[j]<=n;++j){
                vis[i*p[j]]=1;
                if(i%p[j]==0) {
                    phi[i*p[j]]=phi[i]*p[j];
                    break;
                }
                phi[i*p[j]]=phi[i]*(p[j]-1);
            }
        }
    }
    
    void Mobius() { //线性莫比乌斯函数 
        mu[1]=1; int cnt=0;
        for(int i=2;i<=n;i++) {
            if(!vis[i]) p[++cnt]=i,mu[i]=-1;
            for(int j=1;j<=cnt && i*p[j]<=n;j++) {
                vis[i*p[j]]=1;
                if(!i%p[j]) {
    //              mu[i*p[j]]=0;
                    break;
                }
                mu[i*p[j]]=-mu[i];
            }
        }
    }
    
    int main() {
        n=rd();
    }
    
    版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
  • 相关阅读:
    分布式事务-第一刀
    Qt
    自描述C++部分面试题集
    读书笔记6.21
    STL vector容器 和deque容器
    C++ STL框架
    C++ 多态
    C++ 虚继承
    C++ 类的继承和派生
    C++ 类中的函数重载
  • 原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9247989.html
Copyright © 2011-2022 走看看