莫比乌斯真的…难推…有时间…再推吧【捂脸】
#莫比乌斯函数
μ ( x ) = { 1 x = 1 ( − 1 ) k 每 个 因 子 最 多 只 出 现 一 次 ( 即 因 子 的 最 高 幂 指 数 为 1 ) 0 其 他 情 况 \mu(x)= \begin{cases} 1& x=1\\ (-1)^k& 每个因子最多只出现一次(即因子的最高幂指数为1)\\ 0 & 其他情况 \end{cases} μ(x)=⎩⎪⎨⎪⎧1(−1)k0x=1每个因子最多只出现一次(即因子的最高幂指数为1)其他情况
#莫比乌斯反演
莫比乌斯反演呢,其实说的就是
g
(
n
)
=
∑
d
∣
n
μ
(
n
d
)
f
(
d
)
=
∑
d
∣
n
μ
(
d
)
f
(
n
d
)
g(n)=\sum\limits_{d|n} {\mu(\frac{n}{d})f(d)}=\sum\limits_{d|n}\mu(d)f(\frac{n}{d})
g(n)=d∣n∑μ(dn)f(d)=d∣n∑μ(d)f(dn)
变下型就是
f
(
k
)
=
∑
x
=
1
⌊
n
k
⌋
g
(
k
x
)
⇒
g
(
k
)
=
∑
x
=
1
⌊
n
k
⌋
f
(
k
x
)
μ
(
d
)
f(k)=\sum\limits_{x=1}^{\lfloor\frac{n}{k}\rfloor}{g(kx)}\Rightarrow g(k)=\sum\limits_{x=1}^{\lfloor\frac{n}{k}\rfloor}f(kx)\mu(d)
f(k)=x=1∑⌊kn⌋g(kx)⇒g(k)=x=1∑⌊kn⌋f(kx)μ(d)
μ
\mu
μ 这个可以通过预处理线性时间求出
就像这样
↓
\downarrow
↓
void mobius(){
mu[1]=1;
memset(notprime,false,sizeof(notprime));
for(int i=2;i<=50000;i++){
if(!notprime[i]) prime[++top]=i,mu[i]=-1;
for(int j=1;j<=top && prime[j]*i<=50000;j++){
notprime[prime[j]*i]=true;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}mu[i*prime[j]]=-mu[i];
}
}
那么说个小例子吧
1
<
=
x
<
=
n
,
1
<
=
y
<
=
m
1<=x<=n,1<=y<=m
1<=x<=n,1<=y<=m,求使
g
c
d
(
x
,
y
)
=
k
gcd(x,y)=k
gcd(x,y)=k的对数 (bzoj1101/lg3455)
我们设
g
(
k
)
g(k)
g(k)表示
g
c
d
(
x
,
y
)
=
k
gcd(x,y)=k
gcd(x,y)=k的倍数的对数,
f
(
k
)
f(k)
f(k)表示
g
c
d
(
x
,
y
)
=
k
gcd(x,y)=k
gcd(x,y)=k的对数(即所求)
g
(
k
)
=
∑
x
=
1
⌊
n
k
⌋
f
(
k
x
)
g(k)=\sum\limits_{x=1}^{\lfloor\frac{n}{k}\rfloor}f(kx)
g(k)=x=1∑⌊kn⌋f(kx)
由莫比乌斯变形可以得到
f
(
k
)
=
∑
x
=
1
⌊
n
k
⌋
g
(
k
x
)
μ
(
x
)
f(k)=\sum\limits_{x=1}^{\lfloor\frac{n}{k}\rfloor}g(kx)\mu(x)
f(k)=x=1∑⌊kn⌋g(kx)μ(x)
又发现呢,
g
(
k
)
g(k)
g(k)可以求(不像
f
(
k
)
f(k)
f(k) 哼)
因为,如果
g
c
d
(
i
,
j
)
=
k
gcd(i,j)=k
gcd(i,j)=k即
i
=
k
x
1
,
j
=
k
x
2
i=kx_1,j=kx_2
i=kx1,j=kx2,所以就求有多少对
(
x
1
,
x
2
)
(x_1,x_2)
(x1,x2)即可
而
x
1
,
x
2
x_1,x_2
x1,x2都应当是k的倍数才有可能
所以
f
(
k
)
=
∑
x
=
1
⌊
n
k
⌋
μ
(
x
)
⌊
n
k
x
⌋
⌊
m
k
x
⌋
f(k)=\sum\limits_{x=1}^{\lfloor\frac{n}{k}\rfloor}\mu(x)\lfloor\frac{n}{kx}\rfloor\lfloor\frac{m}{kx}\rfloor
f(k)=x=1∑⌊kn⌋μ(x)⌊kxn⌋⌊kxm⌋然后就可以求出来啦
当然…这个方法吧…不太适用【捂脸】…就是…不适用于大多数题
因此…还有另一个想法【捂脸】(是不是感觉很无奈 哎呀我也没办法~)
求的就是
∑
i
=
1
n
∑
j
=
1
m
[
g
c
d
(
i
,
j
)
=
=
k
]
\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==k]
i=1∑nj=1∑m[gcd(i,j)==k]
⇒
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
[
g
c
d
(
i
,
j
)
=
=
1
]
\Rightarrow\sum\limits_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{k}\rfloor}[gcd(i,j)==1]
⇒i=1∑⌊kn⌋j=1∑⌊km⌋[gcd(i,j)==1]
也就是
g
c
d
(
i
,
j
)
=
=
1
gcd(i,j)==1
gcd(i,j)==1时个数加一,就和
ε
\varepsilon
ε很像哦
ε
(
x
)
=
{
1
x
=
1
0
d
e
f
a
u
l
t
ε(x) =\begin{cases} 1 & x=1\\ 0 & default\end{cases}
ε(x)={10x=1default
因此所求就是
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
ε
(
g
c
d
(
i
,
j
)
=
=
1
)
\sum\limits_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{k}\rfloor}\varepsilon(gcd(i,j)==1)
i=1∑⌊kn⌋j=1∑⌊km⌋ε(gcd(i,j)==1)
又因为
μ
∗
1
=
ε
\mu * 1=\varepsilon
μ∗1=ε
⇒
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
∑
d
∣
g
c
d
(
i
,
j
)
μ
(
d
)
\Rightarrow \sum\limits_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{k}\rfloor}\sum\limits_{d|gcd(i,j)}\mu(d)
⇒i=1∑⌊kn⌋j=1∑⌊km⌋d∣gcd(i,j)∑μ(d)
⇒
∑
d
=
1
m
i
n
(
⌊
n
k
⌋
,
⌊
m
k
⌋
)
μ
(
d
)
⌊
n
k
d
⌋
⌊
m
k
d
⌋
\Rightarrow \sum\limits_{d=1}^{min(\lfloor\frac{n}{k}\rfloor,\lfloor\frac{m}{k}\rfloor)}\mu(d)\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor
⇒d=1∑min(⌊kn⌋,⌊km⌋)μ(d)⌊kdn⌋⌊kdm⌋
就是这样【捂脸】
不过呢~
还可以更好哦~
可以分块【捂脸】
因为
⌊
n
k
⌋
\lfloor\frac{n}{k}\rfloor
⌊kn⌋最多
n
\sqrt{n}
n块,
⌊
m
k
x
⌋
\lfloor\frac{m}{kx}\rfloor
⌊kxm⌋最多
m
\sqrt{m}
m块
因此把每个相等的块(
⌊
n
k
⌋
\lfloor\frac{n}{k}\rfloor
⌊kn⌋与
⌊
m
k
⌋
\lfloor\frac{m}{k}\rfloor
⌊km⌋相等)…找到这个块中对应的
μ
\mu
μ和(可通过前缀和求出)即可~
ll f(int n,int m,int k){
if(n>m) swap(n,m);
n/=k;m/=k;
ll ans=0;
for(int i=1,last=1;i<=n;i=last+1){
last=min(n/(n/i),m/(m/i));
ans+=(ll)(mu[last]-mu[i-1])*(m/i)*(n/i);
}return ans;
}
扩展一下,a<=x<=b,c<=y<=d的时候呢
做法就是用容斥原理【捂脸】
结果就是
f
(
b
,
d
,
k
)
−
f
(
a
−
1
,
d
,
k
)
−
f
(
b
,
c
−
1
,
k
)
+
f
(
a
−
1
,
c
−
1
,
k
)
f(b,d,k)-f(a-1,d,k)-f(b,c-1,k)+f(a-1,c-1,k)
f(b,d,k)−f(a−1,d,k)−f(b,c−1,k)+f(a−1,c−1,k)
#狄利克雷卷积
还有一个比较有用的东西:狄利克雷卷积
狄利克雷卷积:对于函数 f , g f,g f,g ,定义它们的卷积为 f ( n ) ∗ g ) n ) = ∑ d ∣ n f ( d ) g ( n d ) f(n)∗g)n)=\sum\limits_{d|n}f(d)g(\frac{n}{d}) f(n)∗g)n)=d∣n∑f(d)g(dn) 。
主要记住几个就可以了
μ
∗
1
=
ε
\mu*1=\varepsilon
μ∗1=ε
φ
∗
1
=
i
d
\varphi*1=id
φ∗1=id
i
d
∗
μ
=
φ
id*\mu=\varphi
id∗μ=φ
i
d
∗
1
=
σ
id*1=\sigma
id∗1=σ
#积性函数
有这样一些性质
- 若 f ( x ) f(x) f(x) 定义域为正整数,满足如果 g c d ( x , y ) = 1 gcd(x,y)=1 gcd(x,y)=1 ,则有 f ( x ) f ( y ) = f ( x y ) f(x)f(y)=f(xy) f(x)f(y)=f(xy)
- 两个积性函数的狄利克雷卷积仍为积性函数。
常见的一些积性函数有 φ \varphi φ、 μ \mu μ、 ε \varepsilon ε、 i d id id、 d d d(因数个数)、 σ \sigma σ(因数和)…
小女子不才,欢迎大佬们找错【捂脸】