积性函数线性筛

1、莫比乌斯函数 μ \mu μ

const int N=6e6;
int visit[N+10],prime[N+10],mu[N+10],cnt;
void init()
{
	cnt=0,mu[1]=1;
	for(int i=2;i<=N;++i)
	{
		if(!visit[i]) prime[++cnt]=i,mu[i]=-1;
		for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
		{
			visit[i*prime[j]]=1;
			if(i%prime[j]==0) break;
			mu[i*prime[j]]=-mu[i];
		}
	}
}

2、欧拉函数 φ \varphi φ

const int N=6e6;
int visit[N+10],prime[N+10],phi[N+10],cnt;
void init()
{
	cnt=0,phi[1]=1;
	for(int i=2;i<=N;++i)
	{
		if(!visit[i]) prime[++cnt]=i,phi[i]=i-1;
		for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
		{
			visit[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]];
		}
	}
}

3、约数个数函数d

维护两个数组: d d d 数组和 n u m num num 数组, d [ x ] d[x] d[x] 表示 x x x 的约数个数, n u m [ x ] num[x] num[x] 表示把 x x x 质因数分解之后,最小的素数 p 1 p_1 p1 的指数 a 1 a_1 a1,例如: x = p 1 a 1 p 2 a 2 … p k a k x=p_1^{a_1}p_2^{a_2}\dots p_k^{a_k} x=p1a1p2a2pkak,那么 n u m [ x ] num[x] num[x]就是 a 1 a_1 a1

const int N=6e6;
int prime[maxn],visit[maxn],d[maxn],num[maxn],cnt;
void init()
{
	d[1]=1,cnt=0;
	for(int i=2;i<=N;++i)
	{
		if(!visit[i]) prime[++cnt]=i,d[i]=2,num[i]=1;
		for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
		{
			visit[i*prime[j]]=1;
			if(i%prime[j]==0)
			{
				d[i*prime[j]]=d[i]/(num[i]+1)*(num[i]+2);
				num[i*prime[j]]=num[i]+1;
				break;
			}
			d[i*prime[j]]=d[i]*2;
			num[i*prime[j]]=1;
		}
	}
}

4、约数和函数 σ σ σ

n的所有约数之和是 σ ( n ) = ( 1 + p 1 + p 1 2 + ⋯ + p 1 a 1 ) ( 1 + p 2 + p 2 2 + ⋯ + p 2 a 2 ) … ( 1 + p k + p k 2 + ⋯ + p k a k ) σ(n)=(1+p_1+p_1^{2}+\dots+p_1^{a_1})(1+p_2+p_2^2+\dots+p_2^{a_2})\dots(1+p_k+p_k^2+\dots+p_k^{a_k}) σ(n)=(1+p1+p12++p1a1)(1+p2+p22++p2a2)(1+pk+pk2++pkak)

维护两个数组:sd[x]表示x的约数之和,sp[x]表示x的最小素因子的等比数列 ( 1 + p 1 + p 1 2 + ⋯ + p 1 a 1 ) (1+p_1+p_1^{2}+\dots+p_1^{a_1}) (1+p1+p12++p1a1)

如果 i % p r i m e [ j ] = = 0 i \%prime[j]==0 i%prime[j]==0,那么最小素因子的指数+1,所维护的sp也就多了一项,变成了 ( 1 + p 1 + p 1 2 + ⋯ + p 1 a 1 + p 1 a 1 + 1 ) (1+p_1+p_1^{2}+\dots+p_1^{a_1}+p_1^{a_1+1}) (1+p1+p12++p1a1+p1a1+1) 更新一下就好

const int N=6e6;
int prime[maxn],visit[maxn],cnt;
int sd[maxn],sp[maxn];

void init()
{
	sd[1]=1,cnt=0;
	for(int i=2;i<=N;++i)
	{
		if(!visit[i]) prime[++cnt]=i,sd[i]=i+1,sp[i]=i+1;
		for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
		{
			visit[i*prime[j]]=1;
			if(i%prime[j]==0)
			{
				sp[i*prime[j]]=sp[i]*prime[j]+1;
				sd[i*prime[j]]=sd[i]/sp[i]*sp[i*prime[j]];				
				break;
			}
			sd[i*prime[j]]=sd[i]*sd[prime[j]];
			sp[i*prime[j]]=prime[j]+1; 			
		}
	}
}

5、积性函数

核心思想:构造两个互质的数,然后利用 f ( x y ) = f ( x ) f ( y ) f(xy)=f(x)f(y) f(xy)=f(x)f(y) 的性质计算

(1)维护一个 low 数组: low[x] 表示 x 最小素因子的幂:即 p 1 a 1 p_1^{a_1} p1a1

(2)维护一个 f 数组: f [x] 表示积性函数的值

(3)计算四个值: f ( 1 ) 、 f ( p ) 、 f ( p k ) 、 f ( p k + 1 ) f(1)、f(p)、 f(p^k)、 f(p^{k+1}) f(1)f(p)f(pk)f(pk+1)

f ( 1 ) f(1) f(1):用在初始化的时候

f ( p ) f(p) f(p):用在筛选素数的时候

f ( p k ) 和 f ( p k + 1 ) f(p^k)和f(p^{k+1}) f(pk)f(pk+1):用在low[i]==i的时候,就是无法构造两个互质的数的时候,直接计算关系

以筛积性函数: f ( n ) = ∑ d ∣ n μ ( d ) ( n d ) 2 f(n)=\sum_{d|n}\mu(d)(\frac nd)^2 f(n)=dnμ(d)(dn)2为例

  1. f ( 1 ) = 1 f(1)=1 f(1)=1
  2. f ( p ) = p 2 − 1 f(p)=p^2-1 f(p)=p21
  3. f ( p k ) = p 2 k + p 2 k − 2 f(p^k)=p^{2k}+p^{2k-2} f(pk)=p2k+p2k2
  4. f ( p k + 1 ) = p 2 k + 2 + p 2 k f(p^{k+1})=p^{2k+2}+p^{2k} f(pk+1)=p2k+2+p2k
    即: f ( p k + 1 ) = f ( p k ) × p 2 f(p^{k+1})=f(p^k)\times p^2 f(pk+1)=f(pk)×p2
const int N=1e6;
int prime[N+10],visit[N+10],cnt;
ll f[N+10],low[N+10];
void init()
{
	f[1]=1,cnt=0;
	for(int i=2;i<=N;++i)
	{
		if(!visit[i]) prime[++cnt]=i,low[i]=i,f[i]=(1ll*i*i-1)%mod;
		for(int j=1;j<=cnt&&i*prime[j]<=N;++j)
		{
			visit[i*prime[j]]=1;
			if(i%prime[j]==0)
			{
				low[i*prime[j]]=low[i]*prime[j];
				if(i==low[i]) f[i*prime[j]]=f[i]*prime[j]%mod*prime[j]%mod;
				else f[i*prime[j]]=f[i/low[i]]*f[low[i]*prime[j]];
				break;
			}
			low[i*prime[j]]=prime[j];
			f[i*prime[j]]=f[i]*f[prime[j]];
		}
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值