(注意,以下除法若未说明自动下取整)
首先放一个莫比乌斯反演常用的两条公式以及证明:莫比乌斯反演定理证明(两种形式)
其中主要用到的是这一条(为了强化记忆我专门手打了一遍
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=1n∑j=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=1n∑j=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=1n∑j=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=1n∑j=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/i⌋⌊m/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/(i∗d)⌋⌊m/(i∗d)⌋ 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/(i∗d)⌋⌊m/(i∗d)⌋ ∑ 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/(i∗d)⌋⌊m/(i∗d)⌋ ∑ 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/T⌋⌊m/T⌋(f∗μ)(T) ∑ T = 1 m i n ( n , m ) ⌊ n / T ⌋ ⌊ m / T ⌋ ( f ∗ μ ) ( T )
把狄利克雷卷积展开来就能得到:
∑T=1min(n,m)⌊n/T⌋⌊m/T⌋∑d|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