线性筛及线性递推欧拉函数
2018-10-14 23:27
197 查看
首先是很常用的线性筛代码:
#define N 1000000 int n, cnt, vis[N+5], prime[N+5]; void sieve() { vis[1] = 1; for(int i = 2; i <= n; ++i) { if(!vis[i]) prime[++cnt] = i; for(int j = 1; j <= cnt && i*prime[j] <= n; ++j) { vis[i*prime[j]] = 1; if(i%prime[j]==0) break; } } }
线性筛保证了每个合数只会被它的最小质因子筛掉,所以复杂度是近似\(O(n)\)的。
欧拉函数
定义:对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目(φ(1)=1)。
计算公式:
其\(p_i\)为\(x\)的质因子。
性质:欧拉函数是积性函数(即\(\phi(mn)=\phi(m)\phi(n)\),m,n互质)
我们考虑怎样在线性筛时顺便求出欧拉函数:
1.若\(vis[i]=1\),说明\(i\)是质数,\(phi[i]=i-1\)
2.若\(prime[j]\)整除\(i\),说明\(i*prime[j]\)标准分解式中\(prime[j]\)的次数已经大于\(1\)了,根据欧拉函数的计算式,不难得出\(phi[i*prime[j]]=phi[i]*prime[j]\)
3.若\(prime[j]\)不整除\(i\),说明\(i\)与\(prime[j]\)互质,又因为\(prime[j]\)是质数,则\(phi[i*prime[j]]=phi[i]*phi[prime[j]]\),进而推出\(phi[i*prime[j]]=phi[i]*(prime[j]-1)\)
我们按照上式把线性筛改造一下就行了:
#define N 1000000 int n, cnt, vis[N+5], prime[N+5], phi[N+5]; void sieve() { vis[1] = phi[1] = 1; for(int i = 2; i <= n; ++i) { if(!vis[i]) prime[++cnt] = i, phi[i] = i-1; for(int j = 1; j <= cnt && i*prime[j] <= n; ++j) { vis[i*prime[j]] = 1; if(i%prime[j]==0) { phi[i*prime[j]] = phi[i]*prime[j]; break; } phi[i*prime[j]] = phi[i]*phi[prime[j]]; } } }
相关文章推荐
- poj2478 Farey Sequence(线性筛法+欧拉函数+递推)
- POJ 2478 线性递推欧拉函数
- POJ 2478 线性递推欧拉函数
- GCD 扩展GCD 快速GCD 模线性方程 模线性方程组 单独求欧拉函数 递推求欧拉函数
- uva 11426 线性欧拉函数筛选+递推
- [HDOJ6172] Array Challenge(线性递推,黑科技)
- 【线性递推DP】hdu 5550
- BZOJ-2190 仪仗队 数论+欧拉函数(线性筛)
- 多校第九场:贪心+矩阵快速幂中间优化+线性递推&线段树递推
- 矩阵乘法优化线性递推
- poj 2478【线性筛素数+欧拉函数】
- [Luogu2158] 仪仗队 线性筛欧拉函数
- 利用积性函数的优化(线性时间:筛素数、求1~n的欧拉函数、约数个数)
- BZOJ4161 常系数齐次线性递推
- BZOJ 2190([SDOI2008]仪仗队-O(n)线性筛欧拉函数)
- poj 2154 Color 波利亚定理 欧拉函数 快速幂 线性筛
- 2186: [Sdoi2008]沙拉公主的困惑 线性筛素数+欧拉函数+乘法逆元
- [51NOD]1126 求递推序列的第N项 [线性递推关系与矩阵乘法]
- Poj 2478-Farey Sequence 欧拉函数,素数,线性筛
- bzoj2818 Gcd 欧拉函数线性筛