莫比乌兹反演, 欧拉函数等乱七八糟的数论公式推导题

这篇博客介绍了数论中的莫比乌兹反演和欧拉函数等概念,通过Q1和Q2两个问题深入探讨数论函数的常见性质,包括狄利克雷卷积、约数个数和能量采集问题的求解。利用数论技巧和变换,博主展示了如何将复杂问题转化为简单的求和形式,并提供了优化算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近学了些数论函数,有了一些小小小小的套路经验
强烈推荐以下几个博客
数论函数变换总结
金策大佬
超详细 课件


狄利克雷卷积

定义: ( f × g ) ( n ) = ∑ d ∣ n f ( d ) g ( n d ) (f \times g)(n) = \sum_{d|n} f(d)g(\frac{n}{d}) (f×g)(n)=dnf(d)g(dn)
方便表示出一些推导过程
随之而来的是数论的一大波函数
e ( n ) = [ n = 1 ] e(n)=[n=1] e(n)=[n=1]
i d ( n ) = n id(n)=n id(n)=n
1 ( n ) = 1 1(n)=1 1(n)=1
d ( n ) = ∑ d ∣ n 1 d(n)=\sum_{d|n} 1 d(n)=dn1 (约数个数)
σ ( n ) = ∑ d ∣ n d \sigma(n)=\sum_{d|n} d σ(n)=dnd
. . . . .... ....


一些数论函数的常见性质
  • ∑ d ∣ n ϕ ( d ) = n \sum_{d|n} \phi(d) = n dnϕ(d)=n 也就是 i d = ϕ × 1 id = \phi \times 1 id=ϕ×1
  • ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n} \mu(d) = [n=1] dnμ(d)=[n=1] 也就是 e = μ × 1 e = \mu \times 1 e=μ×1
  • d ( n m ) = ∑ i ∣ n ∑ j ∣ m [ g c d ( i , j ) = 1 ] d(nm)=\sum_{i|n}\sum_{j|m} [gcd(i,j)=1] d(nm)=injm[gcd(i,j)=1]

单用这几个性质,就已经能解决不少问题了
同时分享一些小套路

Q1

[NOI2010]能量采集

分析过后会发现每个点 ( i , j ) (i, j) (i,j)的权值为 g c d ( i , j ) ∗ 2 − 1 gcd(i, j)*2-1 gcd(i,j)21
那么关键就是求 ∑ i = 1 n ∑ j = 1 m g c d ( i , j ) \sum_{i=1}^n \sum_{j=1}^m gcd(i, j) i=1nj=1mgcd(i,j)
求某个数的和,考虑第一个性质(每个数都可以被它的所有约数表示出来) B u t But But w h y ? ? why?? why??
因为gcd太特殊,没什么规律,但gcd的约数是可以轻松枚举的
根据这一点化式子 (小套路)
∑ i = 1 n ∑ j = 1 m ∑ d ∣ i , j ϕ ( d ) \sum_{i=1}^n \sum_{j=1}^m \sum_{d|i, j} \phi(d) i=1nj=1mdi,jϕ(d)
变换枚举顺序(重要小套路)( n ≤ m n\le m nm, 以下都是整除)
∑ d = 1 n ∑ i = 1 n d ∑ j = 1 m d ϕ ( d ) \sum_{d=1}^n \sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} \phi(d) d=1ni=1dnj=1dmϕ(d)
这么多西格玛算的其实是一个值,所以再化简
∑ d = 1 n ϕ ( d ) ∗ n d ∗ m d \sum_{d=1}^n \phi(d)*\frac{n}{d}*\frac{m}{d} d=1nϕ(d)dndm
现在是 O ( n ) O(n) O(n) 可过本题,但还可以再优化(分块)
关键点在整除,很多 n d \frac{n}{d} dn 的值是相同的,这一小块的 ϕ ( d ) \phi(d) ϕ(d) 乘的都是一个值,用一下前缀和即可,变成 O ( n ) O(\sqrt{n}) O(n )

其实本题还可用性质2优化(不做详细解说)
∑ d = 1 n ∑ i = 1 n d ∑ j = 1 m d d ∗ [ g c d ( i , j ) = 1 ] \sum_{d=1}^n \sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} d*[gcd(i, j)=1] d=1ni=1dnj=1dmd[gcd(i,j)=1]

∑ d = 1 n d ∗ ( ∑ i = 1 n d ∑ j = 1 m d ∑ d 1 ∣ i , j μ ( d 1 ) ) \sum_{d=1}^n d*(\sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} \sum_{d_1|i, j}\mu(d_1) ) d=1nd(i=1dnj=1dmd1i,jμ(d1))

∑ d = 1 n d ∗ ∑ d 1 = 1 n d ∑ i = 1 n d d 1 ∑ j = 1 m d d 1 μ ( d 1 ) \sum_{d=1}^n d*\sum_{d_1=1}^{\frac{n}{d}} \sum_{i=1}^{\frac{n}{dd_1}} \sum_{j=1}^{\frac{m}{dd_1}}\mu(d_1) d=1ndd1=1dni=1dd1nj=1dd1mμ(d1)

∑ d = 1 n d ∗ ∑ d 1 = 1 n d μ ( d 1 ) ∗ n d d 1 ∗ m d d 1 \sum_{d=1}^n d*\sum_{d_1=1}^{\frac{n}{d}} \mu(d_1)*\frac{n}{dd_1}*\frac{m}{dd_1} d=1ndd1=1dnμ(d1)dd1ndd1m

∑ D = 1 n ∑ d ∣ D d ∗ μ ( D d ) ∗ n D ∗ m D \sum_{D=1}^n \sum_{d|D} d*\mu(\frac{D}{d}) * \frac{n}{D} *\frac{m}{D} D=1ndDdμ(dD)DnDm

∑ D = 1 n ϕ ( D ) ∗ n D ∗ m D \sum_{D=1}^n \phi(D)*\frac{n}{D}*\frac{m}{D} D=1nϕ(D)DnDm

殊途同归

Problem B 与这题类似
问题B代码

LL solve(int n, int m, int k){
    n/=k; m/=k;
    if(n>m) swap(n,m);
    LL last=1, ans=0;
    for(int d=1; d<=n; d=last+1){
        last=min(n/(n/d), m/(m/d));//分块优化
        ans+=(su[last]-su[d-1])*(n/d)*(m/d);//前缀和 su = sum mu
    }
/*	For(d,1,min(n,m)){
        ans+=mu[d]*(n/d)*(m/d); //暴力版
    }*/
    return ans;
}

int main()
{
    scanf("%d",&n);
    get_mu();
    while(n--){
        int a,b,c,d,k;
        scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
        printf("%lld\n",solve(b,d,k)-solve(a-1,d,k)-solve(b,c-1,k)+solve(a-1,c-1,k));
    }

    return 0;
}

Q2

SDOI2015 约数个数和
∑ i = 1 N ∑ j = 1 M d ( i j ) \sum_{i=1}^N \sum_{j=1}^M d(ij) i=1Nj=1Md(ij)
直接套用第三个性质
∑ i = 1 N ∑ j = 1 M ∑ x ∣ i ∑ y ∣ j [ g c d ( x , y ) = 1 ] \sum_{i=1}^N \sum_{j=1}^M \sum_{x|i} \sum_{y|j} [gcd(x,y)=1] i=1Nj=1Mxiyj[gcd(x,y)=1]
再套用第二个性质
∑ i = 1 N ∑ j = 1 M ∑ x ∣ i ∑ y ∣ j ∑ d ∣ x , y μ ( d ) \sum_{i=1}^N\sum_{j=1}^M\sum_{x|i}\sum_{y|j}\sum_{d|x,y}\mu(d) i=1Nj=1Mxiyjdx,yμ(d)
变换枚举顺序 (这里的i, j 是原来的x, y)
∑ i = 1 N ∑ j = 1 M ∑ d ∣ i , j μ ( d ) N i M j \sum_{i=1}^N\sum_{j=1}^M\sum_{d|i,j}\mu(d)\frac{N}{i}\frac{M}{j} i=1Nj=1Mdi,jμ(d)iNjM
再次变换
∑ d = 1 N μ ( d ) ∑ i = 1 N d ∑ j = 1 M d N i d M j d \sum_{d=1}^N\mu(d)\sum_{i=1}^{\frac{N}{d}}\sum_{j=1}^{\frac{M}{d}}\frac{N}{id}\frac{M}{jd} d=1Nμ(d)i=1dNj=1dMidNjdM
这里 i d id id就是原来的 i i i
又一个小套路,相同变量放到一起
∑ d = 1 N μ ( d ) ∑ i = 1 N d N i d ∑ j = 1 M d M j d \sum_{d=1}^N\mu(d)\sum_{i=1}^{\frac{N}{d}}\frac{N}{id}\sum_{j=1}^{\frac{M}{d}}\frac{M}{jd} d=1Nμ(d)i=1dNidNj=1dMjdM
g ( x ) = ∑ i = 1 x x i g(x)=\sum_{i=1}^x \frac{x}{i} g(x)=i=1xix
则原式即 ∑ d = 1 N μ ( d ) g ( N d ) g ( M d ) \sum_{d=1}^N\mu(d)g(\frac{N}{d})g(\frac{M}{d}) d=1Nμ(d)g(dN)g(dM)
O ( n n ) O(n\sqrt{n}) O(nn )预处理 O ( n ) O(\sqrt{n}) O(n )


莫比乌兹反演

奇技淫巧 遇到不会化或不好整的函数用它强行搞成 ∑ d ∣ n . . . \sum_{d|n} ... dn... 的形式

f = g × 1 f = g \times 1 f=g×1
g = μ × f g=\mu \times f g=μ×f


YY的GCD
f ( x ) = i s P r i m e ( x ) f(x)=isPrime(x) f(x)=isPrime(x)
F ( x ) = ∑ d ∣ n μ ( x ) ∗ f ( n d ) F(x)=\sum_{d|n} \mu(x)*f(\frac{n}{d}) F(x)=dnμ(x)f(dn)
f ( x ) = ∑ d ∣ n F ( d ) f(x)=\sum_{d|n} F(d) f(x)=dnF(d)
待求式为 ∑ x = 1 n ∑ y = 1 m f ( g c d ( x , y ) ) \sum_{x=1}^n \sum_{y=1}^m f(gcd(x,y)) x=1ny=1mf(gcd(x,y))
∑ x = 1 n ∑ y = 1 m ∑ d ∣ x , y F ( d ) \sum_{x=1}^n \sum_{y=1}^m \sum_{d|x,y} F(d) x=1ny=1mdx,yF(d)
然后就是之前的两个小套路了
关键在于F(x)的求法,即x所有质因子的 μ \mu μ 值和,暴力求就行( O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))),但可以线性求(我不会)
超大常数代码(现在都不知道哪里常数大了)

For(i,1,prime[0]){
	for(int x=1; x*prime[i]<N; x++){
		f[x*prime[i]]+=mu[x];
	}
}

For(i,1,N-1) F[i]=F[i-1]+f[i];

scanf("%lld%lld",&n,&m);
LL ans=0, last=1;
for(LL i=1; i<=min(n,m); i=last+1){
	last=min(n/(n/i), m/(m/i));
	ans+=(F[last]-F[i-1])*(n/i)*(m/i);
}
printf("%lld\n",ans);

总结及拓展
  • ∑ i n σ ( i ) = ∑ i n i ∗ n i \sum_{i}^n \sigma(i)=\sum_{i}^ni*\frac{n}{i} inσ(i)=iniin

  • ∑ i n σ ( g c d ( i , x ) ) = ∑ i n ∑ d ∣ i , n d = ∑ d ∣ n d n d = n d ( n ) \sum_{i}^n\sigma(gcd(i,x))=\sum_{i}^n\sum_{d|i,n}d=\sum_{d|n}d\frac{n}{d}=nd(n) inσ(gcd(i,x))=indi,nd=dnddn=nd(n)

  • ∑ i n i [ g c d ( i , n ) = 1 ] = ∑ i n i ∑ d ∣ i , n μ ( d ) = ∑ d ∣ n μ ( d ) ∑ d ∣ i n i = ∑ d ∣ n μ ( d ) n ( n d + 1 ) 2 = n 2 ( ϕ + e ) \sum_{i}^ni[gcd(i,n)=1]=\sum_{i}^ni\sum_{d|i,n}\mu(d)=\sum_{d|n}\mu(d)\sum_{d|i}^n i=\sum_{d|n}\mu(d)\frac{n(\frac{n}{d}+1)}{2}= \frac{n}{2}(\phi + e) ini[gcd(i,n)=1]=inidi,nμ(d)=dnμ(d)dini=dnμ(d)2n(dn+1)=2n(ϕ+e)

  • ∑ i n l c m ( i , n ) = n ∑ i n i g c d ( i , n ) = n ∑ d ∣ n ∑ i n i [ g c d ( i , n ) = d ] d = n ∑ d ∣ n ∑ j n d j e ( g c d ( j , n d ) \sum_{i}^n lcm(i,n)=n\sum_{i}^n\frac{i}{gcd(i,n)}=n\sum_{d|n}\frac{\sum_i^ni[gcd(i,n)=d]}{d}=n\sum_{d|n}\sum_{j}^{\frac{n}{d}}je(gcd(j,\frac{n}{d}) inlcm(i,n)=ningcd(i,n)i=ndndini[gcd(i,n)=d]=ndnjdnje(gcd(j,dn)

  • ∑ i n ∑ j m i j e ( g c d ( i , j ) ) = ∑ i n ∑ j m i j ∑ d ∣ i , j μ ( d ) = ∑ d μ ( d ) ∑ i = 1 n d ∑ j = 1 m d i j \sum_{i}^n\sum_{j}^mije(gcd(i,j))=\sum_{i}^n\sum_{j}^mij\sum_{d|i,j}\mu(d)=\sum_{d}\mu(d)\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}}ij injmije(gcd(i,j))=injmijdi,jμ(d)=dμ(d)i=1dnj=1dmij

  • 相同部分放到一起

  • 变换枚举顺序(先枚举约数)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值