抽象数学合集

好无聊啊,来总结一下这几天学习的东西。

整除分块

整除分块常用于求解以下形式的式子:

i=1nf(i)g(ni)

其中 f 函数前缀和易得。

直接写结论:

ni 最多只有 n 种取值并且连续。我们将连续相同的一个取值段称为一个块,那么 x 所在块的右端点为 nnx

那么我们可以利用这个性质解决问题:

例题1 UVA11526 H(n)

i=1nni

模板题。f,g 函数均为 id 函数。显然前缀和易求,那么就可以使用整除分块。

while(now<=n){
	res+=(n/(n/now)-now+1)*(n/now);
	now=n/(n/now)+1;
}

例题 2 P2261 [CQOI2007] 余数求和

给定 n,k,求 i=1nkmodi

尽人皆知,原式 =i=1nkk×ki

又出现了那个整除式子,可以使用整除分块了。

while(now<=n){
	int r=(k/now)?(k/(k/now)):n;
	r=min(r,n),res+=(F(now,r))*(k/now);
	now=r+1;
}
cout<<n*k-res<<endl;

其实,整除分块更多是用于莫比乌斯反演的一个优化求和。

狄利克雷卷积

我们定义两个积性函数 f,g 的狄利克雷卷积 (fg)(n)=d|nf(d)g(nd)

狄利克雷卷积满足以下性质:

  • 交换律:fg=gf

  • 结合律:f(gh)=(fg)h

  • 分配律:(f+g)h=fh+gh

同时满足以下几条:

  • μ1=ϵ

  • φ1=id

  • fϵ=f

  • μid=φ

这些性质会经常用到。

和式变换

这块内容很重要,是做题推式子的基础。

和式变换定律

  • 分配律:kai=kai

  • 交换律:ai=abi,其中 b1n 的一个排列;

  • 结合律:(ai+bi)=ai+bi

和式变换技巧

  • 替换条件式:d|gcd(n,m)d=d=1n[d|i][d|j]d

  • 替换指标变量:i=1nj=1m[gcd(i,j)=k]=ik=1njk=1m[gcd(i,j)=k]=i=1nkj=1mk[gcd(i,j)=1]

  • 交换求和顺序:i=1nj=1mf(i)g(j)=j=1mi=1nf(i)g(j)

  • 分离变量(各回各家,各找各妈):i=1nj=1mf(i)g(j)=i=1nf(i)j=1mg(j)

熟悉上述变换以后,就可以做题了!

先上一个被清峥称为板子的题:

例题 1 P3455 [POI2007] ZAP-Queries

给定 n,m,k,求 i=1nj=1m[gcd(i,j)=k]

替换指标变量:

i=1nj=1m[gcd(i,j)=k]

=ik=1njk=1m[gcd(i,j)=k]

=i=1nkj=1mk[gcd(i,j)=1]

因为我们有 μ1=ϵ,所以我们有:

i=1nkj=1mk[gcd(i,j)=1]

=i=1nkj=1mkd|gcd(i,j)μ(d)

枚举 gcd

=i=1nkj=1mkd=1nk[d=gcd(i,j)]μ(d)

=i=1nkj=1mkd=1nk[d|i][d|j]μ(d)

其实就是替换条件式。

分离变量:

=d=1nkμ(d)i=1nk[d|i]j=1mk[d|j]

显然:

=d=1nkμ(d)ndkmdk

至此推式子已经完成,观察到后面的 ndkmdk 完全可以整除分块处理,而 μ(d) 的前缀和通过筛法易求,于是本题就做完了,时间复杂度 O(n)

n/=k,m/=k;
while(now<=min(n,m)){
	int r=min(n/(n/now),m/(m/now));
	res+=(sum[r]-sum[now-1])*(n/now)*(m/now),now=r+1;
}
cout<<res<<endl;

上述 sumi=j=1iμ(j)

posted @   luqyou  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)
点击右上角即可分享
微信分享提示