积性函数
对 于 g c d ( a , b ) = 1 , 都 有 f ( a b ) = f ( a ) ∗ f ( b ) 。 那 么 f ( n ) 是 积 性 函 数 对于gcd(a,b)=1, 都有 f(ab)=f(a)*f(b)。那么f(n)是积性函数 对于gcd(a,b)=1,都有f(ab)=f(a)∗f(b)。那么f(n)是积性函数
欧拉函数
ϕ
(
n
)
\phi(n)
ϕ(n)是一个积性函数,对于一个素数
p
p
p。有:
ϕ
(
p
)
=
p
−
1
\phi(p)=p-1
ϕ(p)=p−1,
ϕ
(
p
k
)
=
p
k
−
p
k
−
1
=
(
p
−
1
)
p
k
−
1
\phi(p^k)=p^k-p^{k-1}=(p-1)p^{k-1}
ϕ(pk)=pk−pk−1=(p−1)pk−1第一个就根据定义理解,第二个就稍微容斥一下就可以了。
莫比乌斯函数 μ \mu μ
莫比乌斯函数完整定义的通俗表达:
1)莫比乌斯函数 μ ( n ) μ(n) μ(n)的定义域是 N N N
2) μ ( 1 ) = 1 μ(1)=1 μ(1)=1
3)当 n n n存在平方因子时, μ ( n ) = 0 μ(n)=0 μ(n)=0
4)当 n n n是素数或奇数个不同素数之积时, μ ( n ) = − 1 μ(n)=-1 μ(n)=−1
5)当 n n n是偶数个不同素数之积时, μ ( n ) = 1 μ(n)=1 μ(n)=1
性质:当 n n n不为 1 1 1时, n n n的所有因子的 μ \mu μ之和等于 0 0 0
∑ d ∣ n μ ( d ) = 0 , ( n ! = 1 ) {\sum_{d|n}\mu(d)}=0,\ (n\ \ !=1) ∑d∣nμ(d)=0, (n !=1)
性质: ∑ d ∣ n μ ( d ) d = ϕ ( n ) n \sum_{d|n}{\frac{\mu(d)}{d}}=\frac{\phi(n)}{n} ∑d∣ndμ(d)=nϕ(n)
求 μ \mu μ?
- Θ ( n ) \Theta(n) Θ(n)线性筛求出1~n的 μ \mu μ
inline void eluer() {
vis[1] = 1; mu[1] = 1;
for (int i = 2; i < N; ++i) {
if (!vis[i]) {
prime[++tot] = i;
mu[i] = -1;
}
for (int j = 1; j <= tot; ++j) {
LL cur = i * prime[j];
if (cur >= (LL)N) break;
vis[cur] = 1;
if (i % prime[j] == 0) {
mu[cur] = 0;
break;
}
else mu[cur] = -mu[i];
}
}
}
解释和说明:如果 i % p r i m e [ j ] = 0 i\%prime[j]=0 i%prime[j]=0的话 ,说明 c u r cur cur中 p r i m e [ j ] prime[j] prime[j]因子至少已经出现了2次。否则因为 μ \mu μ是积性函数, i i i和 p r i m e [ j ] prime[j] prime[j]又显然互质,所以 μ ( c u r ) = μ ( i ) ∗ μ ( p r i m e [ j ] ) = − μ ( i ) \mu(cur)=\mu(i)*\mu(prime[j])=-\mu(i) μ(cur)=μ(i)∗μ(prime[j])=−μ(i)。
求 ϕ \phi ϕ?
- Θ ( n ) \Theta(n) Θ(n)线性筛求1~n的 ϕ \phi ϕ
inline void eluer() {
vis[1] = 1; phi[1] = 1;
for (int i = 1; i < N; ++i) {
if (!vis[i]) {
prime[++tot] = i;
phi[i] = i - 1;
}
for (int j = 1; j <= tot; ++j) {
LL cur = i * prime[j];
if (cur >= N) break;
vis[cur] = 1;
if (i % prime[j] == 0) {
phi[cur] = phi[i] * prime[j];
break;
}
else phi[cur] = phi[i] * (prime[j] - 1);
}
}
}
解释和说明:首先如果 p p p为一个质数,自然 ϕ ( p ) = p − 1 \phi(p)=p-1 ϕ(p)=p−1。当 i % p r i m e [ j ] = 0 i\%prime[j]=0 i%prime[j]=0时, i i i“包含”了 p r i m e [ j ] prime[j] prime[j],所以 p r i m e [ j ] prime[j] prime[j]对 c u r cur cur的质因子的数目没有新的贡献。(不妨考虑根据素因子来计算 ϕ \phi ϕ的那个式子,就只有前面的 n n n扩大了,质因子都是不变的,正确性显然啦! )所以 ϕ [ c u r ] = ϕ [ i ] ∗ p r i m e [ j ] \phi[cur]=\phi[i]*prime[j] ϕ[cur]=ϕ[i]∗prime[j]。当 i % p r i m e [ j ] ! = 0 i\%prime[j]!=0 i%prime[j]!=0时, i 和 p r i m e [ j ] i和prime[j] i和prime[j]显然互质,根据 ϕ \phi ϕ是一个积性函数,有 ϕ [ c u r ] = ϕ [ i ] ∗ ϕ [ p r i m e [ j ] ] = ϕ [ i ] ∗ ( p r i m e [ j ] − 1 ) \phi[cur]=\phi[i]*\phi[ prime[j]]=\phi[i]*(prime[j]-1) ϕ[cur]=ϕ[i]∗ϕ[prime[j]]=ϕ[i]∗(prime[j]−1)。
求1~n的约数个数
- O ( n ) O(n) O(n)线性筛!
inline void eluer() {
vis[1] = 1; f[1] = 1;
for (int i = 2; i < N; ++i) {
if (!vis[i]) {
prime[++tot] = i;
f[i] = 2;
d[i] = 1;
}
for (int j = 1; j <= tot; ++j) {
LL cur = 1LL * i * prime[j];
if (cur >= N) break;
vis[cur] = 1;
if (!(i % prime[j])) {
f[cur] = f[i] / (d[i] + 1) * (d[i] + 2);
d[cur] = d[i] + 1;
break;
}
else {
f[cur] = f[i] * 2;
d[cur] = 1;
}
}
}
}
解释和说明:
f
[
i
]
f[i]
f[i]表示
i
i
i的约数个数,
d
[
i
]
d[i]
d[i]表示
i
i
i的最小质因子的次幂。
如果
i
i
i为质数,没什么好说的。
c
u
r
cur
cur一定是被它的最小素因子
p
r
i
m
e
[
j
]
prime[j]
prime[j]给筛掉的。所以如果
p
r
i
m
e
[
j
]
∣
i
prime[j]|i
prime[j]∣i的话,意会一下是
c
u
r
cur
cur有平方因子
p
r
i
m
e
[
j
]
prime[j]
prime[j]。所以要重新算
p
r
i
m
e
[
j
]
prime[j]
prime[j]的次数的贡献。若
p
r
i
m
e
!
∣
j
prime!|j
prime!∣j,因为
f
f
f是积性函数,
f
(
c
u
r
)
=
f
(
i
)
∗
f
(
p
r
i
m
e
[
j
]
)
=
2
f
(
i
)
f(cur)=f(i)*f(prime[j])=2f(i)
f(cur)=f(i)∗f(prime[j])=2f(i),最小素因子为
p
r
i
m
e
[
j
]
prime[j]
prime[j]。
莫比乌斯反演
其实莫比乌斯反演的式子和狄利克雷卷积是密不可分的。
莫比乌斯反演一般可以处理这样一个形式的题目:
如果你有一些限制,你要求解满足这些限制的一些数或者数对的个数。
记
f
(
n
)
f(n)
f(n)表示
n
n
n这个范围之内的答案,
F
(
n
)
=
∑
d
∣
n
f
(
d
)
F(n)=\sum_{d|n}f(d)
F(n)=∑d∣nf(d)(其实
F
=
f
∗
1
F=f*1
F=f∗1)。
那么根据后面的数论函数的相关内容:
F
=
f
∗
1
<
=
>
F
∗
μ
=
f
∗
1
∗
μ
<
=
>
F
∗
μ
=
f
∗
ϵ
=
f
F=f*1\quad <=>\quad F*\mu=f*1*\mu\quad<=>F*\mu=f*\epsilon=f
F=f∗1<=>F∗μ=f∗1∗μ<=>F∗μ=f∗ϵ=f
故:
f
(
n
)
=
∑
d
∣
n
μ
(
d
)
∗
F
(
n
d
)
(
1
)
f(n)=\sum_{d|n}\mu(d)*F(\frac{n}{d})\quad(1)
f(n)=∑d∣nμ(d)∗F(dn)(1)
如果我们规定
F
(
n
)
=
∑
n
∣
d
f
(
d
)
F(n)=\sum_{n|d}f(d)
F(n)=∑n∣df(d)的话:
同理有
f
(
n
)
=
∑
n
∣
d
μ
(
d
n
)
∗
F
(
d
)
(
2
)
f(n)=\sum_{n|d}\mu(\frac{d}{n})*F(d)\quad(2)
f(n)=∑n∣dμ(nd)∗F(d)(2)
一个较好的证明
https://blog.csdn.net/outer_form/article/details/50588307
一个非常适合初学者的blog(可以说是莫反最简化的一种理解)
https://www.luogu.org/blog/An-Amazing-Blog/mu-bi-wu-si-fan-yan-ji-ge-ji-miao-di-dong-xi
初等变换 [ A = 1 ] = ∑ d ∣ A μ ( d ) [A = 1] = \sum_{d|A}\mu(d) [A=1]=∑d∣Aμ(d)
(虽说这个初等变换不能解决所有需要反演的问题,但是一些简单的 g c d gcd gcd相关反演题用这个会容易理解容易推导。但是难题(hdu6248)什么的还是要好好构造反演。
那么,如果我们要求 f ( n ) f(n) f(n)的话,用 1 1 1式或 2 2 2式就可以把它转化为求另外一些函数的前缀和与数论分块问题了。。
spoj divcnt1
求 ∑ i = 1 n σ 0 ( i ) \sum_{i=1}^n\sigma_0(i) ∑i=1nσ0(i)。 要求 Θ ( ( n ) ) \Theta(\sqrt(n)) Θ((n))
∑
i
=
1
n
∑
d
∣
i
1
=
∑
d
=
1
n
∑
i
=
1
n
d
1
=
∑
d
=
1
n
n
d
\sum_{i=1}^n\sum_{d|i}1=\sum_{d=1}^{n}\sum_{i=1}^{\frac{n}{d}}1=\sum_{d=1}^{n}\frac{n}{d}
∑i=1n∑d∣i1=∑d=1n∑i=1dn1=∑d=1ndn
数论分块。和
l
u
o
g
u
P
3935
luoguP3935
luoguP3935一样。
一个题
求 ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = 1 ] ( n < m ) \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1](n<m) ∑i=1n∑j=1m[gcd(i,j)=1](n<m)
- 利用上面的初等变换来解决问题
∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = 1 ] ( n < m ) \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1](n<m) ∑i=1n∑j=1m[gcd(i,j)=1](n<m)
= ∑ i = 1 n ∑ j = 1 m ∑ d ∣ g c d ( i , j ) μ ( d ) =\sum_{i=1}^n\sum_{j=1}^m\sum_{d|gcd(i,j)}\mu(d) =∑i=1n∑j=1m∑d∣gcd(i,j)μ(d)
=
∑
d
=
1
n
μ
(
d
)
∗
⌊
n
d
⌋
∗
⌊
m
d
⌋
=\sum_{d=1}^n\mu(d)*\lfloor\frac{n}{d}\rfloor*\lfloor\frac{m}{d}\rfloor
=∑d=1nμ(d)∗⌊dn⌋∗⌊dm⌋
所以对
⌊
n
d
⌋
∗
⌊
m
d
⌋
\lfloor\frac{n}{d}\rfloor*\lfloor\frac{m}{d}\rfloor
⌊dn⌋∗⌊dm⌋数论分块,计算一个
μ
\mu
μ的前缀和就好了。
luoguP2522/P3455
求 ∑ i = a b ∑ j = c d [ g c d ( i , j ) = k ] \sum_{i=a}^b\sum_{j=c}^d[gcd(i,j)=k] ∑i=ab∑j=cd[gcd(i,j)=k]
这个计数问题依然有前缀性质,如果我们把
i
,
j
i,j
i,j这两维看成二维矩阵的话。就可以用二维前缀和来做。
所以就化为统计
∑
i
=
1
n
∑
j
=
1
m
[
g
c
d
(
i
,
j
)
=
k
]
\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k]
∑i=1n∑j=1m[gcd(i,j)=k]的答案
考虑把它转为上题,
=
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
[
g
c
d
(
i
,
j
)
=
1
]
=\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}[gcd(i,j)=1]
=∑i=1⌊kn⌋∑j=1⌊km⌋[gcd(i,j)=1]
a
s
a
m
e
p
r
o
b
l
e
m
!
a\ same\ problem!
a same problem!
O
(
n
s
q
r
t
(
n
)
)
O(nsqrt(n))
O(nsqrt(n))
- 正经反演
设
f
(
k
)
=
∑
i
=
1
n
∑
j
=
1
m
[
g
c
d
(
i
,
j
)
=
k
]
,
F
(
n
)
=
∑
n
∣
t
f
(
t
)
f(k)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k],F(n)=\sum_{n|t}f(t)
f(k)=∑i=1n∑j=1m[gcd(i,j)=k],F(n)=∑n∣tf(t)
F ( n ) F(n) F(n)的意义就是含有 n n n这个因子的对数。 F ( x ) = ⌊ a x ⌋ ∗ ⌊ b x ⌋ ( a < b ) F(x)=\lfloor\frac{a}{x}\rfloor*\lfloor\frac{b}{x}\rfloor(a<b) F(x)=⌊xa⌋∗⌊xb⌋(a<b)
根据莫反第二形式:
f
(
k
)
=
∑
k
∣
t
μ
(
t
k
)
,
F
(
t
)
=
∑
k
∣
t
μ
(
t
k
)
⌊
a
t
⌋
∗
⌊
b
t
⌋
f(k)=\sum_{k|t}\mu(\frac{t}{k}),F(t)=\sum_{k|t}\mu(\frac{t}{k})\lfloor\frac{a}{t}\rfloor*\lfloor\frac{b}{t}\rfloor
f(k)=∑k∣tμ(kt),F(t)=∑k∣tμ(kt)⌊ta⌋∗⌊tb⌋
设
t
k
=
x
\frac{t}{k}=x
kt=x,
f
(
k
)
=
∑
x
=
1
⌊
a
k
⌋
μ
(
x
)
⌊
a
x
k
⌋
∗
⌊
b
x
k
⌋
f(k)=\sum_{x=1}^{\lfloor\frac{a}{k}\rfloor}\mu(x)\lfloor\frac{a}{xk}\rfloor*\lfloor\frac{b}{xk}\rfloor
f(k)=∑x=1⌊ka⌋μ(x)⌊xka⌋∗⌊xkb⌋
所以对
⌊
a
x
k
⌋
∗
⌊
b
x
k
⌋
\lfloor\frac{a}{xk}\rfloor*\lfloor\frac{b}{xk}\rfloor
⌊xka⌋∗⌊xkb⌋数论分块就行了。
一个题
给定 n , m n,m n,m,求 ∑ i = 1 n ∑ j = 1 m i j [ g c d ( i , j ) = = k ] ( n < m ) \sum_{i=1}^n\sum_{j=1}^mij[gcd(i,j)==k](n<m) ∑i=1n∑j=1mij[gcd(i,j)==k](n<m)
- 用初等变换解决问题
和上面一样,我们还是考虑把是
k
k
k的整倍数的那些
i
,
j
i,j
i,j同时除以
k
k
k
=
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
i
j
[
g
c
d
(
i
,
j
)
=
=
1
]
k
2
=\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}ij[gcd(i,j)==1]k^2
=∑i=1⌊kn⌋∑j=1⌊km⌋ij[gcd(i,j)==1]k2
= ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ i j ∑ d ∣ g c d ( i , j ) μ ( d ) k 2 =\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}ij\sum_{d|gcd(i,j)}\mu(d)k^2 =∑i=1⌊kn⌋∑j=1⌊km⌋ij∑d∣gcd(i,j)μ(d)k2
= k 2 ∑ d = 1 ⌊ n k ⌋ d 2 μ ( d ) ∑ i = 1 ⌊ n k d ⌋ i ∑ j = 1 ⌊ m k d ⌋ j =k^2\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}d^2\mu(d)\sum_{i=1}^{\lfloor\frac{n}{kd}\rfloor}i\sum_{j=1}^{\lfloor\frac{m}{kd}\rfloor}j =k2∑d=1⌊kn⌋d2μ(d)∑i=1⌊kdn⌋i∑j=1⌊kdm⌋j
我们发现可以预处理
∑
d
=
1
⌊
n
k
⌋
d
2
μ
(
d
)
\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}d^2\mu(d)
∑d=1⌊kn⌋d2μ(d)的前缀和,对后面那一坨数论分块算等差数列平方,最后
a
n
s
∗
=
k
2
ans*=k^2
ans∗=k2就好了。(把
n
k
\frac{n}{k}
kn视作
n
n
n,
m
k
\frac{m}{k}
km视作
m
m
m,就是有两个限制的数论分块了。)
O
(
n
+
s
q
r
t
(
n
)
)
O(n+sqrt(n))
O(n+sqrt(n))
- 正经反演
一个题
求 ∑ i = 1 n ∑ j = 1 m l c m ( i , j ) \sum_{i=1}^n\sum_{j=1}^mlcm(i,j) ∑i=1n∑j=1mlcm(i,j)
因为, l c m ( i , j ) = i ∗ j g c d ( i , j ) lcm(i,j)=\frac{i*j}{gcd(i,j)} lcm(i,j)=gcd(i,j)i∗j
仍然是老套路,枚举
g
c
d
(
i
,
j
)
gcd(i,j)
gcd(i,j)
=
∑
d
=
1
n
∑
i
=
1
n
∑
j
=
1
m
i
∗
j
d
∗
[
g
c
d
(
i
,
j
)
=
d
]
=\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{i*j}{d}*[gcd(i,j)=d]
=d=1∑ni=1∑nj=1∑mdi∗j∗[gcd(i,j)=d]
同时除以
d
d
d
=
∑
d
=
1
n
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
m
d
⌋
i
∗
j
∗
d
∗
[
g
c
d
(
i
,
j
)
=
1
]
=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}i*j*d*[gcd(i,j)=1]
=d=1∑ni=1∑⌊dn⌋j=1∑⌊dm⌋i∗j∗d∗[gcd(i,j)=1]
=
∑
d
=
1
n
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
m
d
⌋
i
∗
j
∗
d
∑
k
∣
g
c
d
(
i
,
j
)
μ
(
k
)
=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}i*j*d\sum_{k|gcd(i,j)}\mu(k)
=d=1∑ni=1∑⌊dn⌋j=1∑⌊dm⌋i∗j∗dk∣gcd(i,j)∑μ(k)
枚举
k
k
k
=
∑
d
=
1
n
d
∑
k
=
1
⌊
n
d
⌋
μ
(
k
)
∗
k
2
∑
i
=
1
⌊
n
d
k
⌋
i
∑
j
=
1
⌊
m
d
k
⌋
j
=\sum_{d=1}^{n}d\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)*k^2\sum_{i=1}^{\lfloor\frac{n}{dk}\rfloor}i\sum_{j=1}^{\lfloor\frac{m}{dk}\rfloor}j
=d=1∑ndk=1∑⌊dn⌋μ(k)∗k2i=1∑⌊dkn⌋ij=1∑⌊dkm⌋j
发现 ⌊ n d ⌋ \lfloor\frac{n}{d}\rfloor ⌊dn⌋是可以数论分块的,在这个数论分块里面再套一个对于 ⌊ n k d ⌋ ⌊ m d k ⌋ \lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{dk}\rfloor ⌊kdn⌋⌊dkm⌋的数论分块就好了。 这样做的复杂度是 O ( n ) O(n) O(n)。 这题通过把后面的等差数列构造新函数可以优化至 O ( s q r t ( n ) ) O(sqrt(n)) O(sqrt(n))啦。(待update)
luoguP3327
求 ∑ i = 1 n ∑ j = 1 m d ( i j ) \sum_{i=1}^n\sum_{j=1}^md(ij) ∑i=1n∑j=1md(ij),这里 d ( i j ) d(ij) d(ij)表示 i j ij ij的约数个数
首先: d ( i j ) = ∑ x ∣ i ∑ y ∣ j [ g c d ( x , y ) = = 1 ] d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)==1] d(ij)=∑x∣i∑y∣j[gcd(x,y)==1]
证明就考虑 i , j i,j i,j的一个质因子 p p p,假设它在 i i i中的次数是 e i e_i ei,在 j j j中的次数是 e j e_j ej。那么它在 i j ij ij中的可能次数是 e i + e j + 1 e_i+e_j+1 ei+ej+1。而右边我们保证了 x , y x,y x,y互质,意思就是 p p p不可在 i , j i,j i,j中同时存在。假设 p p p在 i i i中的次数为 0 0 0,在 j j j中就有 e j + 1 e_j+1 ej+1种选法。 e j = 0 e_j=0 ej=0也同理。再减去重复的 e i = e j = 0 e_i=e_j=0 ei=ej=0的情况,就是 e i + e j + 1 e_i+e_j+1 ei+ej+1。
推导还挺妙的啊?
- 利用初等变换
∑ i = 1 n ∑ j = 1 m d ( i j ) ( n < m ) \sum_{i=1}^n\sum_{j=1}^md(ij)(n<m) ∑i=1n∑j=1md(ij)(n<m)
= ∑ i = 1 n ∑ j = 1 m ∑ x ∣ i ∑ y ∣ j [ g c d ( x , y ) = 1 ] =\sum_{i=1}^n\sum_{j=1}^m\sum_{x|i}\sum_{y|j}[gcd(x,y)=1] =∑i=1n∑j=1m∑x∣i∑y∣j[gcd(x,y)=1]
= ∑ x = 1 n ∑ y = 1 m [ g c d ( x , y ) = 1 ] ⌊ n x ⌋ ⌊ m y ⌋ =\sum_{x=1}^n\sum_{y=1}^m[gcd(x,y)=1]\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor =∑x=1n∑y=1m[gcd(x,y)=1]⌊xn⌋⌊ym⌋
= ∑ x = 1 n ∑ y = 1 m ∑ d ∣ g c d ( x , y ) μ ( d ) ⌊ n x ⌋ ⌊ m y ⌋ ( n < m ) =\sum_{x=1}^n\sum_{y=1}^m\sum_{d|gcd(x,y)}\mu(d)\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor(n<m) =∑x=1n∑y=1m∑d∣gcd(x,y)μ(d)⌊xn⌋⌊ym⌋(n<m)
= ∑ d = 1 n μ ( d ) ∑ x = 1 ⌊ n d ⌋ ∑ y = 1 ⌊ m d ⌋ ⌊ n d x ⌋ ⌊ m d y ⌋ =\sum_{d=1}^n\mu(d)\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{n}{dx}\rfloor\lfloor\frac{m}{dy}\rfloor =∑d=1nμ(d)∑x=1⌊dn⌋∑y=1⌊dm⌋⌊dxn⌋⌊dym⌋
= ∑ d = 1 n μ ( d ) ∑ x = 1 ⌊ n d ⌋ ⌊ n d x ⌋ ∑ y = 1 ⌊ m d ⌋ ⌊ m d y ⌋ =\sum_{d=1}^n\mu(d)\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\lfloor\frac{n}{dx}\rfloor\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{m}{dy}\rfloor =∑d=1nμ(d)∑x=1⌊dn⌋⌊dxn⌋∑y=1⌊dm⌋⌊dym⌋
这个东西居然是可以数论分块的!一开始我惊了。我们用数论分块保证 d d d在 [ L , R ] [L,R] [L,R]区间上保持 ⌊ n d ⌋ \lfloor\frac{n}{d}\rfloor ⌊dn⌋和 ⌊ m d ⌋ \lfloor\frac{m}{d}\rfloor ⌊dm⌋一致。然后,我们惊讶地发现: ∑ y = 1 ⌊ m d ⌋ ⌊ m d y ⌋ \sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{m}{dy}\rfloor ∑y=1⌊dm⌋⌊dym⌋是什么?它就是一个数论分块的子问题!!!!就是 [ 1 , ⌊ m d ⌋ ] [1,\lfloor\frac{m}{d}\rfloor] [1,⌊dm⌋]这个前缀上的 ⌊ m i ⌋ \lfloor\frac{m}{i}\rfloor ⌊im⌋的和!! 所以,我们 O ( n ) O(n) O(n)筛出 μ \mu μ,算出其前缀和。然后 O ( n s q r t ( n ) ) O(nsqrt(n)) O(nsqrt(n))预处理出 g [ i ] g[i] g[i]表示 [ 1 , i ] [1,i] [1,i]这个前缀区间的子问题答案。我们再对外面的 d d d进行数论分块,可以 O ( 1 ) O(1) O(1)算出解。复杂度 O ( ( n + T ) s q r t ( n ) ) O((n+T)sqrt(n)) O((n+T)sqrt(n))
- 正经莫反
∑ i = 1 n ∑ j = 1 m d ( i j ) ( n < m ) \sum_{i=1}^n\sum_{j=1}^md(ij)(n<m) ∑i=1n∑j=1md(ij)(n<m)
= ∑ i = 1 n ∑ j = 1 m ∑ x ∣ i ∑ y ∣ j [ g c d ( x , y ) = 1 ] =\sum_{i=1}^n\sum_{j=1}^m\sum_{x|i}\sum_{y|j}[gcd(x,y)=1] =∑i=1n∑j=1m∑x∣i∑y∣j[gcd(x,y)=1]
= ∑ x = 1 n ∑ y = 1 m [ g c d ( x , y ) = 1 ] ⌊ n x ⌋ ⌊ m y ⌋ =\sum_{x=1}^n\sum_{y=1}^m[gcd(x,y)=1]\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor =∑x=1n∑y=1m[gcd(x,y)=1]⌊xn⌋⌊ym⌋
我们设 f ( k ) = ∑ x = 1 n ∑ y = 1 m [ g c d ( x , y ) = k ] ⌊ n x ⌋ ⌊ m y ⌋ f(k)=\sum_{x=1}^n\sum_{y=1}^m[gcd(x,y)=k]\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor f(k)=∑x=1n∑y=1m[gcd(x,y)=k]⌊xn⌋⌊ym⌋,所以答案就是 f ( 1 ) f(1) f(1)对吧。
又设 F ( n ) = ∑ n ∣ d f ( d ) F(n)=\sum_{n|d}f(d) F(n)=∑n∣df(d),根据莫反二 f ( n ) = ∑ n ∣ d μ ( n d ) F ( d ) f(n)=\sum_{n|d}\mu(\frac{n}{d})F(d) f(n)=∑n∣dμ(dn)F(d)。我们需要快速得出 F ( n ) F(n) F(n)。
F ( n ) F(n) F(n)
= ∑ n ∣ d f ( d ) =\sum_{n|d}f(d) =∑n∣df(d)
= ∑ x = 1 n ∑ y = 1 m [ d ∣ g c d ( x , y ) ] ⌊ n x ⌋ ⌊ m y ⌋ =\sum_{x=1}^n\sum_{y=1}^m[d|gcd(x,y)]\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor =∑x=1n∑y=1m[d∣gcd(x,y)]⌊xn⌋⌊ym⌋
= ∑ x = 1 ⌊ n d ⌋ ∑ y = 1 ⌊ m d ⌋ ⌊ n d x ⌋ ⌊ m d y ⌋ =\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{y=1}^{\lfloor\frac{m} {d}\rfloor}\lfloor\frac{n}{dx}\rfloor\lfloor\frac{m}{dy}\rfloor =∑x=1⌊dn⌋∑y=1⌊dm⌋⌊dxn⌋⌊dym⌋
发现这玩意就是两个 [ 1 , i ] [1,i] [1,i]的数论分块入门题拼起来,可以 O ( n s q r t ( n ) ) O(nsqrt(n)) O(nsqrt(n))预处理。
再看要求的答案式: f ( 1 ) = ∑ d = 1 n μ ( d ) F ( d ) f(1)=\sum_{d=1}^n\mu(d)F(d) f(1)=∑d=1nμ(d)F(d),展开 F ( d ) F(d) F(d)后发现可以数论分块。
(目前感觉初等变换和正经莫反区别不大。。。
luoguP3768
给定 n , p n,p n,p,求 ( ∑ i = 1 n ∑ j = 1 n i j g c d ( i , j ) ) ( m o d p ) (\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j))(mod\ p) (∑i=1n∑j=1nijgcd(i,j))(mod p)
- 60pts
根据之前那个小结论,即求 ∑ i = 1 n ∑ j = 1 n i j ∑ d ∣ g c d ( i , j ) ϕ ( d ) ( m o d p ) \sum_{i=1}^n\sum_{j=1}^nij\sum_{d|gcd(i,j)}\phi(d)(mod\ p) ∑i=1n∑j=1nij∑d∣gcd(i,j)ϕ(d)(mod p)
= ∑ d = 1 n ϕ ( d ) ∑ i = 1 ⌊ n d ⌋ i d ∑ i = 1 ⌊ n d ⌋ j d =\sum_{d=1}^n\phi(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}id\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}jd =∑d=1nϕ(d)∑i=1⌊dn⌋id∑i=1⌊dn⌋jd
= ∑ d = 1 n ϕ ( d ) d 2 ∑ i = 1 ⌊ n d ⌋ i ∑ i = 1 ⌊ n d ⌋ j =\sum_{d=1}^n\phi(d)d^2\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}i\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}j =∑d=1nϕ(d)d2∑i=1⌊dn⌋i∑i=1⌊dn⌋j
= ∑ d = 1 n ϕ ( d ) d 2 ( ∑ i = 1 ⌊ n d ⌋ i ) 2 =\sum_{d=1}^n\phi(d)d^2(\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}i)^2 =∑d=1nϕ(d)d2(∑i=1⌊dn⌋i)2
预处理 ϕ ( d ) d 2 \phi(d)d^2 ϕ(d)d2的前缀和,数论分块乘个等差数列和的平方就好了。
O ( n + s q r t ( n ) ) O(n+sqrt(n)) O(n+sqrt(n)),线性筛搞出 ϕ \phi ϕ是瓶颈。
- 100pts
发现
∑
i
=
1
d
ϕ
(
d
)
\sum_{i=1}^d\phi(d)
∑i=1dϕ(d)是一个积性函数前缀和?杜教筛一下就好了嘛?
(等待学完杜教筛之后再想想吧,现在就咕咕咕
luoguP5221
这题有很多做法,我考场现场想了一个不用莫反不用欧拉函数的做法。就硬是从基本原理出发推导出来了。这里谈谈莫反做法。
要求 ∏ i = 1 n ∏ j = 1 n l c m ( i , j ) g c d ( i , j ) ( m o d P ) \prod_{i=1}^n\prod_{j=1}^n{\frac{lcm(i,j)}{gcd(i,j)}}(mod\ P) ∏i=1n∏j=1ngcd(i,j)lcm(i,j)(mod P), P P P是个质数。
= ∏ i = 1 n ∏ j = 1 n i j g c d 2 ( i , j ) ( m o d P ) =\prod_{i=1}^n\prod_{j=1}^n{\frac{ij}{gcd^2(i,j)}}(mod\ P) =∏i=1n∏j=1ngcd2(i,j)ij(mod P)
= ( n ! ) 2 ( ∏ i = 1 n ∏ j = 1 n g c d ( i , j ) ) 2 =\frac{(n!)^2}{(\prod_{i=1}^n\prod_{j=1}^ngcd(i,j))^2} =(∏i=1n∏j=1ngcd(i,j))2(n!)2
显然只需要关心 ∏ i = 1 n ∏ j = 1 n g c d ( i , j ) \prod_{i=1}^n\prod_{j=1}^ngcd(i,j) ∏i=1n∏j=1ngcd(i,j)就好了。
既然是莫反,我们就一定要确定出来一个 g c d gcd gcd的值,枚举这个值为 d d d
= ∏ d = 1 n d ∑ i = 1 n ∑ j = 1 n [ g c d ( i , j ) = d ] =\prod_{d=1}^nd^{\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=d]} =∏d=1nd∑i=1n∑j=1n[gcd(i,j)=d] 这里要对指数 m o d ( p − 1 ) mod\ (p-1) mod (p−1)了,(希望不要求逆元啊否则就要CRT合并了QAQ)。
= ∏ d = 1 n d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ n d ⌋ [ g c d ( i , j ) = 1 ] =\prod_{d=1}^nd^{\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[gcd(i,j)=1]} =∏d=1nd∑i=1⌊dn⌋∑j=1⌊dn⌋[gcd(i,j)=1]
= ∏ d = 1 n d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ n d ⌋ ∑ k ∣ g c d ( i , j ) μ ( k ) =\prod_{d=1}^nd^{\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{k|gcd(i,j)}\mu(k)} =∏d=1nd∑i=1⌊dn⌋∑j=1⌊dn⌋∑k∣gcd(i,j)μ(k)
= ∏ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) ( ⌊ n d k ⌋ ) 2 =\prod_{d=1}^nd^{\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)(\lfloor\frac{n}{dk}\rfloor)^2} =∏d=1nd∑k=1⌊dn⌋μ(k)(⌊dkn⌋)2
现在,一种方案是枚举 d d d,然后对里面裸数论分块。可以发现指数里面的上界是 ⌊ n d ⌋ \lfloor\frac{n}{d}\rfloor ⌊dn⌋,显然可以对 d d d再分块一次。这样二次分块 O ( n ) O(n) O(n)。但是由于卡空间的缘故,不能再开一个阶乘数组。所以要维护两个指针移动地维护阶乘。
从数论分块到狄利克雷卷积
数论分块
对于计算 ∑ i = 1 n n i \sum_{i=1}^n{\frac{n}{i}} ∑i=1nin,发现不同的 n i \frac{n}{i} in最多只有 Θ ( s q r t ( n ) ) \Theta(sqrt(n)) Θ(sqrt(n))个。
小证明:对于 i < s q r t ( n ) i<sqrt(n) i<sqrt(n),不同的值最多只有 Θ ( s q r t ( n ) ) \Theta(sqrt(n)) Θ(sqrt(n))个啦。对于 i > = s q r t ( n ) i>=sqrt(n) i>=sqrt(n),除一下的范围就限定在了 [ 1 , s q r t ( n ) ] [1,sqrt(n)] [1,sqrt(n)]之间。得证。
结论: 已 知 p , n ( p < = n ) 已知p,n(p<=n) 已知p,n(p<=n),那么使得 ⌊ n i ⌋ = ⌊ n p ⌋ \lfloor\frac{n}{i}\rfloor=\lfloor\frac{n}{p}\rfloor ⌊in⌋=⌊pn⌋的最大的正整数 i i i是 n ⌊ n p ⌋ \frac{n}{\lfloor\frac{n}{p}\rfloor} ⌊pn⌋n
所以处理每一块的 [ l , r ] [l,r] [l,r]即可。
最普通的数论分块:
LL solve(LL n) {// 单限制的数论分块
for (LL L = 1, R; L <= n; L = R + 1) {
R = n / (n / L);
calculate();//[L,R] have the same answers.
}
}
两个限制的数论分块:
LL solve(LL n, LL m) {// 多限制的数论分块
LL upp = min(n, m);
for (LL L = 1, R; L <= upp; L = R + 1) {
R = min(n / (n / l), m / (m / l));
calculate();
}
}
可以分块套分块。
两个积性函数的狄利克雷卷积也是一个积性函数。
f
,
g
f,g
f,g为积性函数的话:
h
(
n
)
=
∑
d
∣
n
f
(
d
)
∗
g
(
n
d
)
h(n)=\sum_{d|n}f(d)*g(\frac{n}{d})
h(n)=∑d∣nf(d)∗g(dn)也是一个积性函数。
对于
n
i
\frac{n}{i}
in这样的形式,我们如果把它数论分块之后,就要求另外一个函数的前缀和。
常见的狄利克雷卷积结论:
σ
0
=
1
∗
1
\sigma_0=1*1
σ0=1∗1
证明:直接按照狄利克雷卷积的定义展开就好了。
1
(
n
)
∗
1
(
n
)
=
∑
d
∣
n
1
(
d
)
∗
1
(
n
d
)
=
∑
d
∣
n
1
=
σ
0
(
n
)
1(n)*1(n)=\sum_{d|n}1(d)*1(\frac{n}{d})=\sum_{d|n}1=\sigma_0(n)
1(n)∗1(n)=∑d∣n1(d)∗1(dn)=∑d∣n1=σ0(n)
σ
1
=
I
∗
1
\sigma_1=I*1
σ1=I∗1
证明:化式子过程
I
(
n
)
∗
1
(
n
)
=
∑
d
∣
n
I
(
d
)
∗
1
(
n
d
)
=
∑
d
∣
n
d
=
σ
1
(
n
)
I(n)*1(n)=\sum_{d|n}I(d)*1(\frac{n}{d})=\sum_{d|n}d=\sigma_1(n)
I(n)∗1(n)=∑d∣nI(d)∗1(dn)=∑d∣nd=σ1(n)
I
=
ϕ
∗
1
I=\phi*1
I=ϕ∗1
证明:化式子
ϕ
(
n
)
∗
1
(
n
)
=
∑
d
∣
n
ϕ
(
d
)
∗
1
(
n
d
)
=
∑
d
∣
n
ϕ
(
d
)
=
n
=
I
(
n
)
\phi(n)*1(n)=\sum_{d|n}\phi(d)*1(\frac{n}{d})=\sum_{d|n}\phi(d)=n=I(n)
ϕ(n)∗1(n)=∑d∣nϕ(d)∗1(dn)=∑d∣nϕ(d)=n=I(n)
小结论: ∑ d ∣ n ϕ ( d ) = n \sum_{d|n}\phi(d)=n ∑d∣nϕ(d)=n
证明(引):
任何一个≤T的正整数,都与T有一个最大公约数R,R也是T的因数,R×S=T。通常会有几个整数各自与T的最大公约数一致,那么相同的有多少呢?与T的最大公约数是R的整数,必然是R的倍数1~S倍。与S互质的数乘以R,符合这个条件;与S互约的数乘以R,不符合条件,因为最大公约数已经不是R。因此,与T最大公约数是R的整数的个数,就是与S互质的整数的个数,就是S的欧拉函数。
整数与T的最大公约数唯一,每个最大公约数的个数之和等于T(存在性与唯一性的统一)。因为每个最大公约数R的个数,等于T/R(即S)的欧拉函数;最大公约数S的个数,也等于R的欧拉函数。最大公约数就是T所有的因数,两个乘积为T的因数,作为最大公约数时的个数,就等于相乘因数的欧拉函数。1和T也不例外。这样,所有最大公约数的个数之和,等于所有因数的欧拉函数之和,等于T这个数本身。
(简单来说,就是建立了欧拉函数与最大公约数的一一对应关系,因为每个T的因数作为最大公约数的次数之和肯定等于T,而这个次数恰好是另一半的欧拉函数)。
ϵ
=
μ
∗
1
\epsilon=\mu*1
ϵ=μ∗1
证明:考虑右边,由于
1
1
1这个东西始终是
1
1
1,所以右边卷起来就是
n
n
n的所有因子的
μ
\mu
μ和。根据前面的定理,自然等于
ϵ
(
n
)
。
\epsilon(n)。
ϵ(n)。
f
∗
ϵ
=
f
f*\epsilon=f
f∗ϵ=f
证明:考虑左边,只有当
d
=
n
d=n
d=n的时候才会有
ϵ
(
n
d
)
=
1
\epsilon(\frac{n}{d})=1
ϵ(dn)=1,只有这一项才会有贡献。