首页 > 其他分享 >O(n)筛法

O(n)筛法

时间:2023-12-20 11:45:30浏览次数:27  
标签:pre phi 筛法 int void mu

void pre(){
	vis[1]=g[1]=f[1]=mu[1]=phi[1]=d[1]=1;
	for(int i=2;i<=n;i++){
		if(!vis[i]){
			pri[++tot]=i;//质数 
			phi[i]=i-1;//欧拉函数 
			mu[i]=-1;//莫比乌斯 
			d[i]=2;//约数个数 
			num[i]=1;//最小质因子个数 
			f[i]=i+1;//约数和 
			g[i]=i+1;//最小质因子的等比数列 
		} 
		for(int j=1;j<=tot;j++){
			vis[i*pri[j]]=1;
			if(i%pri[j]==0){
				phi[i*pri[j]]=phi[i]*pri[j];
				mu[i*pri[j]]=0;
				num[i*pri[j]]=num[i]+1;
				d[i*pri[j]]=d[i]/num[i*pri[j]]*(num[i*pri[j]]+1);
				g[i*pri[j]]=g[i]*pri[j]+1;
				f[i*pri[j]]=f[i]/g[i]*g[i*pri[j]];
				break;
			}
			phi[i*pri[j]]=phi[i]*phi[pri[j]];
			mu[i*pri[j]]=-mu[i];
			d[i*pri[j]]=d[i]*2;
			num[i*pri[j]]=1;
			f[i*pri[j]]=f[i]*f[pri[j]];
			g[i*pri[j]]=pri[j]+1;
		}
	}
}

标签:pre,phi,筛法,int,void,mu
From: https://www.cnblogs.com/hubingshan/p/17916189.html

相关文章

  • 埃筛法求欧拉函数
    普通的欧拉函数求解方法为\(O(\log_{}{N})\),可是当遇到下面这题时,阁下又该如何应对呢?给定一个正整数\(n\),求\(1∼n\)中每个数的欧拉函数之和。其中,\(1\leqn\leq10^6\)。很显然,传统方法复杂度为\(O(n\log_{}{n})\),最大可达\(10^9\),明显超时。那么这里,我们提供一种......
  • 再探欧式筛——一种泛用性更强的欧拉筛法/线性筛法实现
    一、引言欧式筛/欧拉筛法/线性筛法(EulerSieve)是一种能够在\(O(n)\)时间复杂度内,处理\([1,n]\)内质数的方法。其相比埃氏筛/埃拉托斯特尼筛法(EratosthenesSieve)的\(O(n\log\logn)\)时间复杂度,主要的优化在于欧式筛保证了所有正整数\(n\)均只被其最小质因数\({minp}_n......
  • 浅谈筛法——埃氏筛
    前置芝士:见浅谈筛法——普通筛例·1素数个数:运用上一篇的知识,可得出以下代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintmaxn=1e8+5;intn,ans;boolprime(intx){ if(x==1){ return0; } if(x==2){ return1; } for(inti=2......
  • 浅谈筛法——普通筛
    前置知识-因数和倍数(六年级及以上自行跳过):\(n\divm=k\),我们就说\(n\)是\(m\)和\(k\)的倍数,\(m\)和\(k\)是\(n\)的倍数。简单来说就是这样的:\(\text{被除数}\div\text{除数,余数为0}\),那我们就说除数是被除数的因数,被除数是除数的倍数。前置知识-素数和合数(六年级及以上自......
  • 筛法
    更新日志:2023/10/15:发布文章一、埃氏筛1.算法原理略2.时间复杂度\(O(n\log{\log{n}})\)详细证明见oi-wiki3.代码实现boolvis[NN];intprime[NN],cnt;typedeflonglongll;voidEra(intn){ for(lli=2;i<=n;++i){ if(!vis[i]){ prime[++cnt]=i;......
  • 数论筛法小记
    BaseSievebaseDirichletConvolutionSqrtDecomposition会挖坑,好让复习的时候长脑子。以下所有\(p\)都是质数,即\(p\in\mathbb{P}\),同时默认均为正整数。Base唯一分解定理(算术基本定理):\[\begin{align} \foralln>1,n=\prod\limits_{i=1}^kp_i^{t_i}\end{align}\]......
  • 素数的判定:筛法
    素数很有用,特别是在密码学领域中,比如RSA中很重要的一步就是寻找两个比较大的素数,通常的做法是先随机生成一个大整数,然后使用一些素性判定的方法,比如费马素性测试。在算法竞赛的数论题目中,素数也很常见,通常的做法是先找出一定范围内的所有素数,用到时再查表,筛法就可以做到。1.埃氏......
  • 筛法求约数个数
    推荐视频:516筛法求约数个数点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineLLlonglongconstintN=1e8+10;intp[N],cnt;intd[N];//d[i]记录i的约数的个数inta[N];//a[i]记录i的最小质因子的次数boolvis[N];voidget_d(intn){//筛法求......
  • 数学筛法
    有的时候怕忘记,写篇小博客记录一下。线性筛素数inlinevoidinit(intn){for(inti=2;i<=n;i++){if(!vis[i])prime[++cnt]=i;for(intj=1;j<=cnt&&i*prime[j];j++){vis[i*prime[j]]=1;if(!(i%prime[j]))br......
  • 素数—埃式筛法
    埃式筛法思路 利用当前已经确定的素数筛选掉非素数的自然数,然后向后选择没有被筛选的自然数,即素数,重复上述操作。实现打印[1,100]区间的素数#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>prime;vector<bool>isPrime(11......