线性欧拉筛

//欧拉函数 小于等于 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;
}

原文地址:https://www.cnblogs.com/Adventurer-H/p/10884492.html

时间: 2024-10-08 21:05:44

线性欧拉筛的相关文章

Dirichlet&#39;s Theorem on Arithmetic Progressions POJ - 3006 线性欧拉筛

题意 给出a d n    给出数列 a,a+d,a+2d,a+3d......a+kd 问第n个数是几 保证答案不溢出 直接线性筛模拟即可 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 bool Is_Primes[1000005]; 5 int Primes[1000005]; 6 int A[1000005]; 7 int cnt; 8 void Prime(int n){ 9 cnt=0; 1

Goldbach&#39;s Conjecture POJ - 2262 线性欧拉筛水题 哥德巴赫猜想

题意 哥德巴赫猜想:任一大于2的数都可以分为两个质数之和 给一个n 分成两个质数之和 线行筛打表即可 可以拿一个数组当桶标记一下a[i]  i这个数是不是素数  在线性筛后面加个装桶循环即可 #include<cstdio> #include<cstring> using namespace std; bool Is_Primes[1000005]; int Primes[1000005]; int cnt; void Prime(int n){ cnt=0; memset(Is_

线性(欧拉)筛&amp;欧拉函数

线性筛法 what is 线性筛??就是基于最基本的筛法的优化. 在基础的筛法上,我们发现有的数字会被重复筛,例如6既会被2枚举到也会被3枚举到,必然有重复运算. 我们的做法就是让每一个数的最小因数筛. \(FOR\) \(EXAMPLE:\) 有一个数\(2 * 2 * 3 * 5\) 有另一个数 \(3 * 3 * 3* 5\) 那么第一个数枚举到3的话,筛到的数字是\(2 * 2 * 3 * 3 * 5\) 但是在第二个数字再次枚举的时候 枚举到2时 也会枚举到\(2 * 2 * 3 *

BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes筛)

题目大意:给定整数N(N <= 1e7),求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.. 思路:推一推. 设gcd(x,y) = p,则x / p与y / p互质 问题就转化成了N / p中有多少个数互质,然后累加就可以了. =>对于任意a,b,a <= N / p,b <= N / p,且a与b互质 =>gcd(a,b) == 1 现在问题就很明显了,看到这个形式就很容易想到欧拉函数,求一下phi,算一下前缀和,累加. 注意这里求欧拉一

BZOJ 2190 SDOI 2008 仪仗队 线性欧拉筛

标题效果:有一个格子组件图,假设三个人在一条直线上,那么第一个人将不会看到第三人.现在,有一个人站在(1,1)在.我问他是否能看到n*n的人数的矩阵. 思考:如果你想站(1,1)这名男子看到了一个立场(x,y)一个人.gcd(x,y) == 1,这是一个经典的模型,仅仅要求出n以内phi的和就能够了. 方法就是线性筛. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <

Sum of Consecutive Prime Numbers POJ - 2739 线性欧拉筛(线性欧拉筛证明)

题意:给一个数 可以写出多少种  连续素数的合 思路:直接线性筛 筛素数 暴力找就行   (素数到n/2就可以停下了,优化一个常数) 其中:线性筛的证明参考:https://blog.csdn.net/nk_test/article/details/46242401 https://blog.csdn.net/qq_40873884/article/details/79124552 https://blog.csdn.net/baoli1008/article/details/50788512

The Embarrassed Cryptographer POJ - 2635 同余模+高精度处理 +线性欧拉筛(每n位一起处理)

题意:给出两数乘积K(1e100) 和 一个数L(1e6)  问有没有小于L(不能等于)的素数是K的因数 思路:把数K切割 用1000进制表示   由同余模公式知   k%x=(a*1000%x+b*1000*1000%x+c*1000*1000*1000%x....) a b c等为 相应位置的三位数  这样切割可以减少模的次数 防止超时 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #incl

HDU 3823 Prime Friend(线性欧拉筛+打表)

Besides the ordinary Boy Friend and Girl Friend, here we define a more academic kind of friend: Prime Friend. We call a nonnegative integer A is the integer B’s Prime Friend when the sum of A and B is a prime. So an integer has many prime friends, fo

线性筛素数(欧拉筛)

线性筛素数(欧拉筛) 欧拉筛为啥是\(O(n)\)的呢?我们先来看看代码. #include <cstdio> using namespace std; const int maxn=10000000; int n, m, prime[maxn], isnt_prime[maxn], tot; void get_prime(int n){ isnt_prime[0]=isnt_prime[1]=1; for (int i=2; i<=n; ++i){ //当前数是所有数小于n的数而不只是