数论 - 线性筛法与积性函数
来源:互联网 发布:好玩的java web项目 编辑:程序博客网 时间:2024/05/20 13:10
首先以求1000000以内的素数为例来探讨筛法
Eratosthenes筛法(埃拉托斯特尼筛法)
时间复杂度:O(N*loglogN)
空间复杂度:O(N)
代码:
#include <map>#include <set>#include <list>#include <cmath>#include <deque>#include <queue>#include <stack>#include <bitset>#include <cctype>#include <cstdio>#include <string>#include <vector>#include <complex>#include <cstdlib>#include <cstring>#include <fstream>#include <sstream>#include <utility>#include <iostream>#include <algorithm>#include <functional>#define LL long long#define INF 0x7fffffffusing namespace std;const int maxn = 1000005;bool vis[maxn];int prime[maxn];int tot;void init() { tot = 0; memset(vis, false, sizeof(vis)); for(int i = 2; i < maxn; i ++) { if(!vis[i]) { prime[tot ++] = i; for(int j = i * 2; j < maxn; j += i) { vis[j] = true; } } }}int main() { init(); for(int i = 0; i < 100; i ++) { cout << prime[i] << " "; } return 0;}
Euler筛法(欧拉筛法)
每个合数只会被它最小的质因数筛去,因此时间复杂度为O(N)。
此种为线性筛法
代码:
#include <map>#include <set>#include <list>#include <cmath>#include <deque>#include <queue>#include <stack>#include <bitset>#include <cctype>#include <cstdio>#include <string>#include <vector>#include <complex>#include <cstdlib>#include <cstring>#include <fstream>#include <sstream>#include <utility>#include <iostream>#include <algorithm>#include <functional>#define LL long long#define INF 0x7fffffffusing namespace std;const int maxn = 1000005;bool vis[maxn];int prime[maxn];int tot;void init() { tot = 0; memset(vis, false, sizeof(vis)); for(int i = 2; i < maxn; i ++) { if(!vis[i]) prime[tot ++] = i; for(int j = 0; j < tot; j ++) { if(i * prime[j] > maxn) break; vis[i * prime[j]] = true; if(i % prime[j] == 0) break; } }}int main() { init(); for(int i = 0; i < 100; i ++) { cout << prime[i] << " "; } return 0;}
线性筛法求欧拉函数
代码:
#include <map>#include <set>#include <list>#include <cmath>#include <deque>#include <queue>#include <stack>#include <bitset>#include <cctype>#include <cstdio>#include <string>#include <vector>#include <complex>#include <cstdlib>#include <cstring>#include <fstream>#include <sstream>#include <utility>#include <iostream>#include <algorithm>#include <functional>#define LL long long#define INF 0x7fffffffusing namespace std;const int maxn = 1000005;bool vis[maxn];int prime[maxn];int fai[maxn];int tot;void init() { memset(vis, false, sizeof(vis)); fai[1] = 1; tot = 0; for(int i = 2; i < maxn; i ++) { if(!vis[i]) { prime[tot ++] = i; fai[i] = i - 1; } for(int j = 0; j < tot; j ++) { if(i * prime[j] >= maxn) break; vis[i * prime[j]] = true; if(i % prime[j] == 0) { fai[i * prime[j]] = fai[i] * prime[j]; break; } else { fai[i * prime[j]] = fai[i] * (prime[j] - 1); } } }}int main() { init(); for(int i = 1; i < 100; i ++) { cout << fai[i] << " "; } return 0;}
线性筛法求莫比乌斯函数
代码:
#include <map>#include <set>#include <list>#include <cmath>#include <deque>#include <queue>#include <stack>#include <bitset>#include <cctype>#include <cstdio>#include <string>#include <vector>#include <complex>#include <cstdlib>#include <cstring>#include <fstream>#include <sstream>#include <utility>#include <iostream>#include <algorithm>#include <functional>#define LL long long#define INF 0x7fffffffusing namespace std;const int maxn = 1000005;bool vis[maxn];int prime[maxn];int mu[maxn];//莫比乌斯函数int tot;void init() { memset(vis, false, sizeof(vis)); mu[1] = 1; tot = 0; for(int i = 2; i < maxn; i ++) { if(!vis[i]) { prime[tot ++] = i; mu[i] = -1; } for(int j = 0; j < tot; j ++) { if(i * prime[j] >= maxn) break; vis[i * prime[j]] = true; if(i % prime[j] == 0) { mu[i * prime[j]] = 0; break; } else { mu[i * prime[j]] = -mu[i]; } } }}int main() { init(); for(int i = 1; i < 100; i ++) { cout << mu[i] << " "; } return 0;}
0 0
- 【数论】线性筛与积性函数
- 数论 - 线性筛法与积性函数
- 线性筛法与积性函数
- 数论与积性函数
- 模板整理:数论---线性筛素数,线性筛欧拉函数
- luogu 1865 数论 线性素数筛法
- 【数论】Send a Table, UVa10820 【线性筛法】【欧拉函数】
- BZOJ-2190 仪仗队 数论+欧拉函数(线性筛)
- BZOJ_P2818 GCD(数论GCD+欧拉函数线性筛)
- 线性筛法 与 线性求欧拉函数 的计算模板
- 数论函数与数论恒等式
- 【HDU5728 2016 Multi-University Training Contest 1F】【数论+迭代 欧拉函数线性筛+积性递归】PowMod 欧拉函数积性性质+无穷幂迭代
- 线性筛法与欧拉函数
- 【数论】线性筛素数,线性筛欧拉函数,求前N个数的约数个数
- 【数论内容】线性筛素数,线性筛欧拉函数,求前N个数的约数个数
- 【数论】线性筛素数,线性筛欧拉函数,求前N个数的约数个数
- 【线性筛法求解积性函数】Archer
- 利用积性函数实现的各种线性筛法
- C语言中的逻辑运算符
- HDU 3081 Marriage Match II(最大流 + 并查集)
- struct的初始化及其构造函数
- iOS-为视图添加阴影
- JAVA在ACM中的几点应用
- 数论 - 线性筛法与积性函数
- JAVA接口的用法
- hdu-4127 Flood-it!(IDA*算法)
- 黑马程序员--- objective-c 封装 set与get
- 字符串处理
- STL几个(set map vector string)用法
- Java学习第十七天
- HADOOP 集群安装配置
- Java Annotation详解+自定义java注解(一)