莫比乌斯反演常用套路整理

(注意,以下除法若未说明自动下取整)
首先放一个莫比乌斯反演常用的两条公式以及证明:莫比乌斯反演定理证明(两种形式)
其中主要用到的是这一条(为了强化记忆我专门手打了一遍

G(d)=d|nF(n)==>F(n)=n|dμ(d/n)G(d) G ( d ) = ∑ d | n F ( n ) ==> F ( n ) = ∑ n | d μ ( d / n ) ∗ G ( d )

然后再放一个莫比乌斯反演裸题:bzoj 1101此题的题解可自行去网上搜索;

而平时经常能遇到这类问题:

ans=i=1nj=1mf(gcd(i,j)) a n s = ∑ i = 1 n ∑ j = 1 m f ( g c d ( i , j ) )

其中f()可以替换成任意函数;
这时候可以选择枚举其gcd是多少,设gcd=d,原式化为:
d=1min(n,m)i=1nj=1m[gcd(i,j)=d]f(d) ∑ d = 1 m i n ( n , m ) ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = d ] f ( d )

中括号的意思是若满足条件,则为1,否则为0;
那么就可以把f(d)提出来:
d=1min(n,m)f(d)i=1nj=1m[gcd(i,j)=d] ∑ d = 1 m i n ( n , m ) f ( d ) ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = d ]

f(d)右边是不是和上边那道裸题很像?其实就是同一种形式了;
这时候如果能线性求出每一个f(d),已经可以O(n根号n)求解每一组询问了;
但有时n很大的话可能就不行了;
考虑将f(d)右边那坨式子按照裸题中的方法整理一下(我再详细写一遍吧以防以后再忘掉qwq
即求
i=1nj=1m[gcd(i,j)=d] ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = d ]

翻译一下就是1<=i<=n,1<=j<=m中,gcd(i,j)=d的对数
设:
G(i)=i|dF(d) G ( i ) = ∑ i | d F ( d )

那么G(d)的答案为(n/d)*(m/d)除法下取整;
由上边莫比乌斯反演的基础公式得(下边的符号似乎会有点乱,脑补替换一下吧orz):
F(d)=d|iμ(i/d)G(i) F ( d ) = ∑ d | i μ ( i / d ) ∗ G ( i )

即:
F(d)=d|ii<=min(n,m)μ(i/d)n/im/i F ( d ) = ∑ d | i i <= m i n ( n , m ) μ ( i / d ) ⌊ n / i ⌋ ⌊ m / i ⌋

因为F(d)(在n,m情况下)=F(1)(在n/d,m/d除法下取整情况下)得:
F(d)=i=1min(n/d,m/d)μ(i)n/(id)m/(id) F ( d ) = ∑ i = 1 m i n ( n / d , m / d ) μ ( i ) ∗ ⌊ n / ( i ∗ d ) ⌋ ⌊ m / ( i ∗ d ) ⌋

那么就可以替换到之前那个式子里:
d=1min(n,m)f(d)i=1min(n/d,m/d)μ(i)n/(id)m/(id) ∑ d = 1 m i n ( n , m ) f ( d ) ∑ i = 1 m i n ( n / d , m / d ) μ ( i ) ∗ ⌊ n / ( i ∗ d ) ⌋ ⌊ m / ( i ∗ d ) ⌋

然后再把f()放进去:
d=1min(n,m)i=1min(n/d,m/d)f(d)μ(i)n/(id)m/(id) ∑ d = 1 m i n ( n , m ) ∑ i = 1 m i n ( n / d , m / d ) f ( d ) ∗ μ ( i ) ∗ ⌊ n / ( i ∗ d ) ⌋ ⌊ m / ( i ∗ d ) ⌋

这时候还是不大好算,考虑枚举d*i是多少,设T=d*i,这时候可以意识流想一下,因为d是从1到min(n,m)中枚举的,i是从剩余的所有可能性中枚举的,所以d*i会取完所有1到min(n,m),而当d*i也就是T为一个确定值时,其能贡献的答案为所有d*i=T的情况;
这样听起来是不是很熟悉,也就是所谓狄利克雷卷积:
T=1min(n,m)n/Tm/T(fμ)(T) ∑ T = 1 m i n ( n , m ) ⌊ n / T ⌋ ⌊ m / T ⌋ ( f ∗ μ ) ( T )

把狄利克雷卷积展开来就能得到:
T=1min(n,m)n/Tm/Td|Tf(d)μ(T/d) ∑ T = 1 m i n ( n , m ) ⌊ n / T ⌋ ⌊ m / T ⌋ ∑ d | T f ( d ) ∗ μ ( T / d )

其实f和μ中的自变量可以互换,类比一下fft中的卷积,只要满足相乘为定值T就可以;
那么只要能线性预处理出(f*μ)(T)的前缀和,就能分块O(根号n)求出每一组询问了;
当然不一定每个题都能线性求出前缀和,不过大部分这类题的套路应该都是一样的;

希望和我相同脑回路的人能看懂我写的吧orz

你可能感兴趣的:(学习心得,莫比乌斯反演,数论)