日记
建议各大 OJ 加上切题防沉迷。
我们设 calc(n,m)=∑i=1n∑j=1m[gcd(i,j)=k]。那么这题的答案就是 calc(b,d)−calc(a−1,d)−calc(c−1,b)+calc(a−1,c−1)。考虑如何求 calc(n,m)。我们直接开始推柿子。
calc(n,m)=i=1∑nj=1∑m[gcd(i,j)=k]=i=1∑⌊kn⌋j=1∑⌊km⌋[gcd(i,j)=1]=i=1∑⌊kn⌋j=1∑⌊km⌋d∣gcd(i,j)∑μ(d)=d=1∑min(n,m)μ(d)i=1∑⌊kn⌋[d∣i]j=1∑⌊dm⌋[d∣j]=d=1∑min(n,m)μ(d)⌊kdn⌋⌊kdm⌋然后我们就可以愉快的数论分块了,时间复杂度 O(n)。
但是这道沟槽题目还要卡常。。。
题意:求 ∑i=1n∑j=1mlcm(i,j)。讨厌小作文题面
于是我们继续推柿子:
calc(n,m)=i=1∑nj=1∑mlcm(i,j)=i=1∑nj=1∑mgcd(i,j)ij=d=1∑min(n,m)i=1∑nj=1∑mdij[d=gcd(i,j)]=d=1∑min(n,m)i=1∑nj=1∑mdij[d∣i][d∣j][gcd(di,dj)=1]=d=1∑min(n,m)i=1∑⌊dn⌋j=1∑⌊dm⌋did×jd[gcd(i,j)=1]=d=1∑min(n,m)i=1∑⌊dn⌋j=1∑⌊dm⌋dij[gcd(i,j)=1]=d=1∑min(n,m)di=1∑⌊dn⌋j=1∑⌊dm⌋ij[gcd(i,j)=1]设 f(n,m)=∑i=1n∑j=1mij[gcd(i,j)=1],那么 calc(n,m)=∑d×f(⌊dn⌋,⌊dm⌋),依然是数论分块。现在我们尝试求解 f(n,m)。
f(n,m)=i=1∑nj=1∑mij[gcd(i,j)=1]=i=1∑nj=1∑mijd∣gcd(i,j)∑μ(d)=d=1∑min(n,m)μ(d)i=1∑n[d∣i]j=1∑m[d∣j]⋅ij=d=1∑min(n,m)μ(d)i=1∑⌊dn⌋j=1∑⌊dm⌋id×jd=d=1∑min(n,m)d2μ(d)i=1∑⌊dn⌋j=1∑⌊dm⌋ij=d=1∑min(n,m)d2μ(d)i=1∑⌊dn⌋ij=1∑⌊dm⌋j我们发现 ∑d=1min(n,m)d2μ(d) 可以预处理前缀和,∑i=1⌊dn⌋i 和 ∑j=1⌊dm⌋j 其实就是俩等差数列求和,O(1) 算就是了。于是我们就能够通过数论分块愉快的求解 f(n,m),再套一层数论分块就能愉快的求解 calc(n,m) 了。时间复杂度 O(n+m)。
其实就是 Problem b的弱化版。
现在感觉二项式反演十分的和蔼可亲。
我们先令 k=2n+k,即恰好有 k 个糖果比药片大。看起来就很像二项式反演啊。我们设 dpi,j 表示前 i 对里有 j 对满足条件。转移就有 dpi,j=dpi−1,j+(lsti−j+1)×dpi−1,j−1,其中 lsti 表示将 a,b 都从小到大排序之后,blsti 是第一个比 ai 大的。于是我们就得到了 gi=(n−i)!×dpn,i,反演一下就可以得到 fk 了。
这里还窜出来个子集反演。
其实所有反演的本质都是容斥原理。
子集反演还没学所以这个题目就不写了。
这个柿子是真的推不来。
我们发现 μ(lcm(x,y))=μ(x)μ(y)μ(gcd(x,y)),于是就是并不愉快的推柿子时间。
calc(n,m)=i=1∑nj=1∑mμ(lcm(x,y))=i=1∑nj=1∑mμ(x)μ(y)μ(gcd(x,y))=d=1∑min(n,m)i=1∑n[d∣i]j=1∑n[d∣j]⋅μ(i)μ(j)μ(d)[gcd(di,dj)=1]=d=1∑min(n,m)μ(d)i=1∑⌊dn⌋j=1∑⌊dm⌋μ(i⋅d)μ(j⋅d)[gcd(i,j)=1]=d1=1∑min(n,m)μ(d1)i=1∑⌊d1n⌋j=1∑⌊d1m⌋μ(i⋅d1)μ(j⋅d1)d2∣gcd(i,j)∑μ(d2)=d1=1∑min(n,m)μ(d1)d2=1∑⌊d1min(n,m)⌋μ(d2)i=1∑⌊d1n⌋[d2∣i]j=1∑⌊d1m⌋[d2∣j]⋅μ(i⋅d1)μ(j⋅d1)=d1=1∑min(n,m)μ(d1)d2=1∑⌊d1min(n,m)⌋μ(d2)i=1∑⌊d1d2n⌋j=1∑⌊d1d2m⌋μ(i⋅d1d2)μ(j⋅d1d2)我们枚举 t=d1d2,那么就有 calc(n,m)=∑t∑d=1min(n,m)μ(d)μ(dt)∑i=1⌊tn⌋∑j=1⌊tm⌋μ(i⋅t)μ(j⋅t)。∑t∑d=1min(n,m)μ(d)μ(dt) 可以预处理,∑i=1⌊tn⌋∑j=1⌊tm⌋μ(i⋅t)μ(j⋅t) 可以暴力算。总复杂度是一个调和级数,O(nlogn)。
首先有结论:d(ij)=∑x∣i∑y∣j[gcd(x,y)=1]。然后就是推柿子时间。
d(ij)=x∣i∑y∣j∑[gcd(x,y)=1]=x∣i∑y∣j∑d∣gcd(x,y)∑μ(d)=d=1∑min(i,j)[d∣i][d∣j]⋅μ(d)x∣i∑[d∣x]y∣j∑[d∣y]=d=1∑min(i,j)[d∣i][d∣j]⋅μ(d)x∣di∑y∣dj∑1=d=1∑min(i,j)[d∣i][d∣j]⋅μ(d)×d(di)×d(dj)将 d(ij) 带回原式:
calc(n,m)=i=1∑nj=1∑md=1∑min(i,j)[d∣i][d∣j]μ(d)×d(di)×d(dj)=d=1∑min(n,m)μ(d)i=1∑n[d∣i]j=1∑n[d∣j]×d(di)×d(dj)=d=1∑min(n,m)μ(d)i=1∑⌊dn⌋d(i)j=1∑⌊dm⌋d(j)我们可以预处理 i∈[1,n] 的 d(i) 并计算前缀和,然后就可以愉快的数论分块了。
今天反演了一天,这公式打的我简直想死。不过倒是发现了反演的用途:都是把限制放宽,放到好求的状态,然后求出 g 就能反演出 f 了。
比如二项式反演:把“恰好”放宽成“至少”,就可以通过钦定几个元素的状态求出 g。
比如莫比乌斯反演:[gcd(i,j)=1]=∑d∣gcd(i,j)μ(d),就可以不用管死人 i,j 是否互质了。
今天晚自习上课的时候才发现做了 9 道反演。于是写了一晚上的日记,码了一晚上的公式。希望以后 vjudge 出一个切题防沉迷。