zoukankan      html  css  js  c++  java
  • 线性欧拉筛

    欧拉函数积性:

    当 a | b 时 : φ(ab) =  a * φ(b); (a整除b)

    当 a⊥b 时 : φ(ab) = φ(a) * φ(b); (a与b互质)

    //欧拉函数 小于等于 n 且与n互质的正整数个数 
    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 100001;
    
    int n,p;
    int prime[N],phi[N],mark[N];
    
    int main(){
        cin >> n;
        phi[1] = 1;
        for(int i = 2; i <= n; ++i){
            if(!mark[i]){ 
                prime[++p] = i;
                phi[i] = i - 1;
            } 
            for(int j = 1; j <= p; ++j){
                if(i * prime[j] > n) break;
                mark[i * prime[j]] = 1;
                if(i % prime[j] == 0){
                    phi[i * prime[j]] = prime[j] * phi[i];      //欧拉积性 if(a|b) phi(ab) = a * phi(b); 
                    break;
                }
                else phi[i * prime[j]] = phi[i] * phi[prime[j]];//欧拉积性 if(a互质b) phi(ab) = phi(a) * phi(b); 
            }
        }
        for(int i = 1; i <= p; ++i) cout << prime[i] << " ";
        cout << endl;
        for(int i = 1; i <= n; ++i) cout << phi[i] << " ";    
        return 0;
    }
  • 相关阅读:
    为什么要用do-while(0)?
    网络字节序&大小端存储
    sql语句w3school教程
    C++编码规范
    std::deque双端队列介绍
    gdb基本操作
    gdb调试多线程
    数据库基础
    删除vector所有元素
    stl迭代器失效
  • 原文地址:https://www.cnblogs.com/Adventurer-H/p/10884492.html
Copyright © 2011-2022 走看看