如果学习莫比乌斯反演的某一个瞬间不知道自己是谁自己在干什么眼前的公式是什么,
不要慌张,
它本来,就不知道在干什么
本人查阅了一些大佬的博客,
本人水平有限,无法深入浅出,各位量力而行
非常感谢这位帅气的人
需知条件:
∗ * ∗在此为狄利克雷卷积{!在 ∑ \sum ∑里面的*都是数论乘法}
形式:
t = g ∗ f t=g*f t=g∗f
t ( n ) = ∑ d ∣ n f ( d ) ∗ g ( n d ) t(n)=\sum_{d|n}f(d)*g(\frac{n}{d}) t(n)=∑d∣nf(d)∗g(dn)
不多赘述性质等
自行观看
以及 μ \mu μ函数
函数 μ \mu μ是函数1的逆
逆是什么?
1.单位元是什么
符号为ϵ
设函数 f f f,
f ∗ ϵ = f f* ϵ=f f∗ϵ=f
ϵ = [ n = = 1 ] ϵ=[n==1] ϵ=[n==1]
= { 1 ( n = 1 ) 0 ( n > 1 ) =\begin{cases} 1~~~~~~(n=1)\\ 0~~~~~~(n>1)\\ \end{cases} ={1 (n=1)0 (n>1)
2.逆是什么
对于任何一个函数 f f f来说
都以一个 g g g使得 f ∗ g = ϵ f*g=ϵ f∗g=ϵ
然后这里就要牵扯逆等一些性质了,。。。太多了
所以移步这个大佬的博客
这个大佬的博客对于一些前缀知识的说明比较详细,但他的证明太粗略了,我这种菜比看不懂,所以就有了这篇博客。。。
了解什么叫做积性函数
虽然如果来看莫比乌斯反演的应该要有积性函数这个前缀知识的
移步另一个大佬的博客
首先函数1是积性函数,这应该是肉眼可见的
设质数 p p p
有:
μ ( p k ) = { 1 ( k = 0 ) − 1 ( k = 1 ) 0 ( k > 1 ) \mu(p^k)= \begin{cases} 1~~~~~~(k=0)\\ -1~~~~~(k=1)\\ 0~~~~~~(k>1)\\ \end{cases} μ(pk)=⎩⎪⎨⎪⎧1 (k=0)−1 (k=1)0 (k>1)
因为 1 ∗ μ = ϵ 1*\mu=ϵ 1∗μ=ϵ
所以 [ n = = 1 ] = ∑ d ∣ n μ ( d ) ∗ 1 ( 设 为 1 式 ) [n==1]=\sum_{d|n}\mu(d)*1~~~(设为1式) [n==1]=∑d∣nμ(d)∗1 (设为1式) (可以看做这样)
归纳(?):
假设我们有单位元定义可知 ϵ ( 2 ) = 0 ϵ(2)=0 ϵ(2)=0
带入1式可得, μ ( 2 ) = − 1 \mu(2)=-1 μ(2)=−1
于是由此可得
μ ( p ) = − 1 \mu(p)=-1 μ(p)=−1
同: ϵ ( 4 ) = 0 ϵ(4)=0 ϵ(4)=0
可知
ϵ ( 4 ) = μ ( 1 ) + μ ( 2 ) + μ ( 4 ) ϵ(4)=\mu(1)+\mu(2)+\mu(4) ϵ(4)=μ(1)+μ(2)+μ(4)
可得 μ ( 4 ) = 0 \mu(4)=0 μ(4)=0
由此归纳,可得 μ ( p k ) = 0 \mu(p^k)=0 μ(pk)=0
总结可得
设p为质数
μ ( n ) = { ( − 1 ) t ( n = p 1 p 2 p 3 p t − 1 p t ) 0 ( n 不 满 足 以 上 条 件 , ( n 有 平 方 因 子 , 例 如 n = 4 ) ) \mu(n)= \begin{cases} (-1)^t~~~~~~(n=p_{1}p_{2}p_{3}p_{t-1}p_{t})\\ 0~~~~~(n不满足以上条件,(n有平方因子,例如n=4))\\ \end{cases} μ(n)={(−1)t (n=p1p2p3pt−1pt)0 (n不满足以上条件,(n有平方因子,例如n=4))
仔细推理可得出上面结论
至此,易得
( ∑ d ∣ n μ ( d ) ) = { 1 ( n = = 1 ) 0 ( n > 1 ) (\sum_{d|n}\mu(d))=\begin{cases} 1~~~(n==1)\\ 0~~~(n>1)\\ \end{cases} (∑d∣nμ(d))={1 (n==1)0 (n>1)
其实看上面就可以得出来了
好了,莫比乌斯反演的重头戏来了
已知条件: g = f ∗ 1 < = > g ( n ) = ∑ d ∣ n f ( d ) g=f*1~~~~<=>~~~~~g(n)=\sum_{d|n}f(d) g=f∗1 <=> g(n)=∑d∣nf(d)
结论: f ( n ) = ∑ d ∣ n μ ( d ) ∗ g ( n d ) f(n)=\sum_{d|n}\mu(d)*g(\frac{n}{d}) f(n)=∑d∣nμ(d)∗g(dn)
证明:
将结论同等变换:
f ( n ) = ∑ d ∣ n μ ( d ) ∗ g ( n d ) = ∑ d ∣ n ( μ ( d ) ∗ ∑ k ∣ d n f ( k ) ) = ∑ k ∣ n ( f ( k ) ∗ ∑ d ∣ n k μ ( d ) ) f(n)=\sum_{d|n}\mu(d)*g(\frac{n}{d})=\sum_{d|n}(\mu(d)*\sum_{k|\frac{d}{n}}f(k))=\sum_{k|n}(f(k)*\sum_{d|\frac{n}{k}}\mu(d)) f(n)=d∣n∑μ(d)∗g(dn)=d∣n∑(μ(d)∗k∣nd∑f(k))=k∣n∑(f(k)∗d∣kn∑μ(d))
为什么可以恒等变换?
∵ { d ∣ n k ∣ n \because \begin{cases} d|n\\ k|n\\ \end{cases} ∵{d∣nk∣n
可得
k d ∣ n ~~~~~~~~~kd|n kd∣n
可得
∴ { k ∣ n d ∣ n k \therefore\begin{cases} k|n\\ d|\frac{n}{k}\\ \end{cases} ∴{k∣nd∣kn
那为什么要恒等变换?
( ∑ d ∣ n μ ( d ) ) = { 1 ( n = = 1 ) 0 ( n > 1 ) (\sum_{d|n}\mu(d))=\begin{cases} 1~~~(n==1)\\ 0~~~(n>1)\\ \end{cases} (∑d∣nμ(d))={1 (n==1)0 (n>1)
恒等变换是为了把证明的方向给到这个公式上(先推且把形式二证明完再证明,等不住就先看最底下的证明,习惯如此不好意思)
所以当且仅当 n k = 1 \frac{n}{k}=1 kn=1时, ∑ d ∣ n k ( μ ( d ) ) = 1 \sum_{d|\frac{n}{k}}(\mu(d))=1 ∑d∣kn(μ(d))=1,即 n k ( \frac{n}{k}( kn(即上面公式中的 n ) = 1 n)=1 n)=1
所以至此
∑ k ∣ n ( f ( k ) ∗ ∑ d ∣ n k ( μ ( d ) ) = f ( n ) \sum_{k|n}(f(k)*\sum_{d|\frac{n}{k}}(\mu(d))=f(n) ∑k∣n(f(k)∗∑d∣kn(μ(d))=f(n)
证明完毕
条件: g ( d ) = ∑ d ∣ n f ( n ) g(d)=\sum_{d|n}f(n) g(d)=∑d∣nf(n)
结论: f ( d ) = ∑ d ∣ n μ ( n d ) ∗ g ( n ) f(d)=\sum_{d|n}\mu(\frac{n}{d})*g(n) f(d)=∑d∣nμ(dn)∗g(n)
//如果看到这里,你想自己证明的话,那么跟随你的内心想法来自己证明,想怎么证就怎么证,证不出来了再看下面的证明。这样对你的帮助会大一些
证明:
设 k = n d k=\frac{n}{d} k=dn
由结论恒等变换
f ( d ) = ∑ k = 1 + ∞ μ ( k ) ∗ g ( d k ) f(d)=\sum_{k=1}^{+\infty}\mu(k)*g(dk) f(d)=∑k=1+∞μ(k)∗g(dk)
这一步:因为 n n n是此时不知,所以 k k k的取值是无限的,所以对于每一个当前的 k k k来说, d k = n ( dk=n( dk=n(当前的 n ) n) n)
设所有的 d k ∣ t dk|t dk∣t
相当于说 t t t包含了所有的 n n n,即相当于枚举 n n n
f ( d ) = ∑ k = 1 + ∞ ( μ ( k ) ∗ ∑ d k ∣ t f ( t ) ) f(d)=\sum_{k=1}^{+\infty}(\mu(k)*\sum_{dk|t}f(t)) f(d)=∑k=1+∞(μ(k)∗∑dk∣tf(t))
可得
f ( d ) = ∑ d ∣ t ( f ( t ) ∗ ∑ k ∣ t d μ ( k ) ) f(d)=\sum_{d|t}(f(t)*\sum_{k|\frac{t}{d}}\mu(k)) f(d)=∑d∣t(f(t)∗∑k∣dtμ(k))
当且仅当 t d = 1 \frac{t}{d}=1 dt=1时, ∑ k ∣ t d μ ( k ) = 1 \sum_{k|\frac{t}{d}}\mu(k)=1 ∑k∣dtμ(k)=1(跟形式一证明一样)
可得
∑ d ∣ t ( f ( t ) ∗ ∑ k ∣ t d μ ( k ) ) = f ( d ) \sum_{d|t}(f(t)*\sum_{k|\frac{t}{d}}\mu(k))=f(d) ∑d∣t(f(t)∗∑k∣dtμ(k))=f(d)
恒等变换回去则可得
∑ d ∣ n μ ( n d ) ∗ g ( n ) = f ( d ) \sum_{d|n}\mu(\frac{n}{d})*g(n)=f(d) ∑d∣nμ(dn)∗g(n)=f(d)
至此,证明完毕
YY的GCD
设 p p p为质数
x < = n , y < = m x<=n,y<=m x<=n,y<=m求 g c d ( x , y ) = p gcd(x,y)=p gcd(x,y)=p有多少组
题解:
可将题意化为:
∑ x = 1 n ∑ y = 1 m ∑ i = 1 k [ g c d ( x , y ) = p i ] \sum_{x = 1}^{n} \sum_{y = 1}^{m} \sum_{i = 1}^{k} [\mathrm{gcd}(x, y) = p_i] ∑x=1n∑y=1m∑i=1k[gcd(x,y)=pi]
设 f ( d ) f(d) f(d)表示满足 g c d ( x , y ) = d \mathrm{gcd}(x, y) = d gcd(x,y)=d 且 1 ≤ x ≤ n , 1 ≤ y ≤ m 1 \leq x \leq n, 1 \leq y \leq m 1≤x≤n,1≤y≤m 的 ( x , y ) (x, y) (x,y) 的对数。
设 g ( d ) g(d) g(d)表示满足 d ∣ ∣ g c d ( x , y ) 且 1 ≤ x ≤ n , 1 ≤ y ≤ m d|\mid \mathrm{gcd}(x, y)且 1 \leq x \leq n, 1 \leq y \leq m d∣∣gcd(x,y)且1≤x≤n,1≤y≤m 的 ( x , y ) (x, y) (x,y)的对数。
可得
g ( x ) = ⌊ n x ⌋ ⌊ m x ⌋ g(x) = \lfloor \frac{n}{x} \rfloor \lfloor \frac{m}{x} \rfloor g(x)=⌊xn⌋⌊xm⌋
g ( x ) = ∑ x ∣ d min ( n , m ) f ( d ) g(x) = \sum_{x \mid d}^{\min(n, m)} f(d) g(x)=∑x∣dmin(n,m)f(d)
由莫比乌斯反演的形式一可得
f ( x ) = ∑ x ∣ d m u n ( n , m ) μ ( d x ) g ( d ) f(x)=\sum_{x|d}^{mun(n,m)} \mu(\frac{d}{x})g(d) f(x)=∑x∣dmun(n,m)μ(xd)g(d)
a n s = ∑ i = 1 k f ( p i ) = ∑ i = 1 k ∑ p i ∣ d min ( n , m ) μ ( d p i ) ans=\sum_{i=1}^{k}f(p_{i})=\sum_{i = 1}^{k} \sum_{p_i \mid d}^{\min(n, m)} \mu(\frac{d}{p_i}) ans=∑i=1kf(pi)=∑i=1k∑pi∣dmin(n,m)μ(pid)
观察上式,发现我们枚举 p i p_{i} pi的倍数只有 ⌊ min ( n , m ) p i ⌋ \lfloor \frac{\min(n, m)}{p_i} \rfloor ⌊pimin(n,m)⌋ 个
所以
a n s = ∑ i = 1 k ∑ p i ∣ d min ( n , m ) μ ( d p i ) \mathrm{ans} = \sum_{i = 1}^{k} \sum_{p_i \mid d}^{\min(n, m)} \mu(\frac{d}{p_i}) ans=∑i=1k∑pi∣dmin(n,m)μ(pid)
= ∑ i = 1 k ∑ d = 1 ⌊ min ( n , m ) p i ⌋ μ ( d ) g ( d p i ) =\sum_{i = 1}^{k} \sum_{d = 1}^{\lfloor \frac{\min(n, m)}{p_i} \rfloor} \mu(d) g(dp_i) =∑i=1k∑d=1⌊pimin(n,m)⌋μ(d)g(dpi)
= ∑ i = 1 k ∑ d = 1 ⌊ min ( n , m ) p i ⌋ μ ( d ) ⌊ n d p i ⌋ ⌊ m d p i ⌋ = \sum_{i = 1}^{k} \sum_{d = 1}^{\lfloor \frac{\min(n, m)}{p_i} \rfloor} \mu(d) \lfloor \frac{n}{dp_i} \rfloor \lfloor \frac{m}{d p_i} \rfloor =∑i=1k∑d=1⌊pimin(n,m)⌋μ(d)⌊dpin⌋⌊dpim⌋
令 T = d p i T = dp_i T=dpi
a n s = ∑ T = 1 min ( n , m ) ⌊ n T ⌋ ⌊ m T ⌋ ∑ k ∣ T μ ( T k ) ans= \sum_{T = 1}^{\min(n, m)} \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor \sum_{k \mid T} \mu(\frac{T}{k}) ans=∑T=1min(n,m)⌊Tn⌋⌊Tm⌋∑k∣Tμ(kT)
然后整除分块,可得结果。
#include
using namespace std;
#define ll long long
const int maxn=10000010;
ll mu[maxn];
int vis[maxn],prime[maxn],cnt,f[maxn],sum[maxn],n,m;
inline void mobi()
{
mu[1]=1;
for (int i=2; i<=maxn-10; i++)
{
if (!vis[i]) prime[++cnt]=i,mu[i]=-1;
for (int j=1; j<=cnt&&i*prime[j]<=maxn-10; j++)
{
vis[i*prime[j]]=1;
if (i%prime[j]==0) break;
mu[i*prime[j]]=-mu[i];
}
}
for (int i=1; i<=cnt; i++)
for (int j=1; prime[i]*j<=maxn-10; j++)
f[j*prime[i]]+=mu[j];
for (int i=1; i<=maxn-10; i++)
sum[i]+=sum[i-1]+f[i];
}
inline ll solve(int x,int y)
{
ll ans=0;
for (int l=1,r; l<=x; l=r+1)
{
r=min(x/(x/l),y/(y/l));
ans+=(ll)(sum[r]-sum[l-1])*(ll)(x/l)*(ll)(y/l);
}
return ans;
}
int main()
{
mobi();
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
if (n>m) swap(n,m);
printf("%lld\n",solve(n,m));
}
}
我的浅谈大概到此结束了,如有错误或者疑问,一定要指出来!!!十分感谢。
再次鸣谢大佬
哎,因为平时没好好努力,所以这么优美的东西只能浅尝辄止,却也获益匪浅,
之后会陆续更一些应用上来。(maybe吧哈哈)