欧拉筛 线性筛 素数+莫比乌斯的mu[]

https://blog.csdn.net/qq_39763472/article/details/82428602

模板来自https://blog.csdn.net/Avalon_cc/article/details/81663214

bool isP[N];
int P[N], ind;
void Euler() {
    mem(isP,1);
    mu[1]=1; ind=0;
    for(int i=2;i<N;i++) {
        if(isP[i]) P[ind++]=i, mu[i]=-1;
        for(int j=0;j<ind;j++) {
            if(i*P[j]>N) break;
            isP[i*P[j]]=0;
            if(i%P[j]==0) {
                mu[i*P[j]]=0; break;
            } else mu[i*P[j]]=-mu[i];
        }
    }
} // 欧拉筛

原文地址:https://www.cnblogs.com/zquzjx/p/10383663.html

时间: 2024-10-05 04:33:11

欧拉筛 线性筛 素数+莫比乌斯的mu[]的相关文章

【bzoj2401】陶陶的难题I “高精度”+欧拉函数+线性筛

题目描述 求 输入 第一行包含一个正整数T,表示有T组测试数据.接下来T<=10^5行,每行给出一个正整数N,N<=10^6. 输出 包含T行,依次给出对应的答案. 样例输入 7 1 10 100 1000 10000 100000 1000000 样例输出 1 2127 18446224 183011304660 1827127167830060 18269345553999897648 182690854273058293758232 题解 “高精度”+欧拉函数+线性筛 由于$i$和$j$

线性求欧拉函数值和筛选素数

2818: Gcd 题目: 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. 1<=N<=10^7 算法: 求解 g = Gcd(x,y)为素数,转换问题成x/g,y/g互质.所以,只要求出[1,N/pi]内互质的对数(pi为1....N之间的素数).枚举pi就可以了.而这里就可以用到线性的欧拉求解,普通欧拉为O(nlognlogn). /* 线性素数加欧拉筛法O(N) 题目: 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数

线性筛法(欧拉筛法)求素数

时间复杂度O(n)当n比较大时欧拉筛法所用的时间比O(nloglogn)的算法的时间少的会越来越明显 为什么呢? 因为在欧拉筛法中,每一个合数只被访问并将其所对的f[]的值修改了一次. for(i = 2; i <= n; i++) { if(f[i] == 0) { p[++cnt] = i; } for(j = 1; j <= cnt; j++) { if(i * p[j] > n)break; f[i * p[j]] = 1; if(i % p[j] == 0)break; } }

欧拉函数,求素数

/*=======================================================*\ | 递推求欧拉函数phi(i) 欧拉函数\varphi(n)是小于或等于n的正整数中与n互质的数的数目 \*=======================================================*/ #define N 3000000 __int64 phi[N + 100]; void Euler() { int i, j; for(i = 1; i

hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion

http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不会 就自己写了个容斥搞一下(才能维持现在的生活) //别人的题解https://blog.csdn.net/luyehao1/article/details/81672837 #include <iostream> #include <cstdio> #include <cstr

欧拉筛&amp;&amp;线性筛

复杂度 n 分析 其实就是把埃筛的改进罢了,避免重复 具体看代码 代码 #include<bits/stdc++.h> using namespace std; bool vis[10000000]; int prime[10000]; int Oulashai(int n){ memset(vis,0,sizeof(vis)); int cnt=0; for(int i=2;i<=n;i++){ if(!vis[i]) prime[cnt++]=i; for(int j=0;j<

欧拉函数线性筛法

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #define lli long long int 6 using namespace std; 7 const int MAXN=10000001; 8 void read(int &n) 9 { 10 char c='+';int x=0;bool flag=0; 11 while(c&l

质因数分解+欧拉筛+线性基

质因数分解: for(int i=2;i*i<=n;i++){ if(n%i==0) p.push_back(i); while(n%i==0) n/=i; } if(n!=1) p.push_back(n); 欧拉函数(线性筛): //欧拉函数 phi[x]代表[1,x]种与x互质的数的个数 void getphi() { phi[1]=1;int cnt=0; for(int i=2;i<=N;i++){ if(!vis[i]){prime[++cnt]=i;phi[i]=i-1;} fo

数论线性筛总结 (素数筛,欧拉函数筛,莫比乌斯函数筛,前n个数的约数个数筛)

线性筛 线性筛在数论中起着至关重要的作用,可以大大降低求解一些问题的时间复杂度,使用线性筛有个前提(除了素数筛)所求函数必须是数论上定义的积性函数,即对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数,若a,b不互质也满足的话则称作完全积性函数,下面说明每个筛子是怎么筛的. 最基础的是素数筛,其它三个筛都是以素数筛为前提 素数筛 void get_prime() { int pnum = 0; for(int i = 2;