莫比乌斯反演与狄利克雷卷积

积性函数

gcd(a,b)=1,f(ab)=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)是一个积性函数,对于一个素数ppp。有:
ϕ(p)=p1\phi(p)=p-1ϕ(p)=p−1, ϕ(pk)=pkpk1=(p1)pk1\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)的定义域是NNN

2)μ(1)=1μ(1)=1μ(1)=1

3)当nnn存在平方因子时,μ(n)=0μ(n)=0μ(n)=0

4)当nnn是素数或奇数个不同素数之积时,μ(n)=1μ(n)=-1μ(n)=−1

5)当nnn是偶数个不同素数之积时,μ(n)=1μ(n)=1μ(n)=1

性质:当nnn不为111时,nnn的所有因子的μ\muμ之和等于000

dnμ(d)=0, (n  !=1){\sum_{d|n}\mu(d)}=0,\ (n\ \ !=1)∑d∣n​μ(d)=0, (n  !=1)

性质:dnμ(d)d=ϕ(n)n\sum_{d|n}{\frac{\mu(d)}{d}}=\frac{\phi(n)}{n}∑d∣n​dμ(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%prime[j]=0i\%prime[j]=0i%prime[j]=0的话 ,说明curcurcur中prime[j]prime[j]prime[j]因子至少已经出现了2次。否则因为μ\muμ是积性函数,iii和prime[j]prime[j]prime[j]又显然互质,所以μ(cur)=μ(i)μ(prime[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);
        }
    }
}

解释和说明:首先如果ppp为一个质数,自然ϕ(p)=p1\phi(p)=p-1ϕ(p)=p−1。当i%prime[j]=0i\%prime[j]=0i%prime[j]=0时,iii“包含”了prime[j]prime[j]prime[j],所以prime[j]prime[j]prime[j]对curcurcur的质因子的数目没有新的贡献。(不妨考虑根据素因子来计算ϕ\phiϕ的那个式子,就只有前面的nnn扩大了,质因子都是不变的,正确性显然啦! )所以ϕ[cur]=ϕ[i]prime[j]\phi[cur]=\phi[i]*prime[j]ϕ[cur]=ϕ[i]∗prime[j]。当i%prime[j]!=0i\%prime[j]!=0i%prime[j]!=0时,iprime[j]i和prime[j]i和prime[j]显然互质,根据ϕ\phiϕ是一个积性函数,有ϕ[cur]=ϕ[i]ϕ[prime[j]]=ϕ[i](prime[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]表示iii的约数个数,d[i]d[i]d[i]表示iii的最小质因子的次幂。
如果iii为质数,没什么好说的。 curcurcur一定是被它的最小素因子prime[j]prime[j]prime[j]给筛掉的。所以如果prime[j]iprime[j]|iprime[j]∣i的话,意会一下是curcurcur有平方因子prime[j]prime[j]prime[j]。所以要重新算prime[j]prime[j]prime[j]的次数的贡献。若prime!jprime!|jprime!∣j,因为fff是积性函数,f(cur)=f(i)f(prime[j])=2f(i)f(cur)=f(i)*f(prime[j])=2f(i)f(cur)=f(i)∗f(prime[j])=2f(i),最小素因子为prime[j]prime[j]prime[j]。

莫比乌斯反演

其实莫比乌斯反演的式子和狄利克雷卷积是密不可分的。

莫比乌斯反演一般可以处理这样一个形式的题目:

如果你有一些限制,你要求解满足这些限制的一些数或者数对的个数。
f(n)f(n)f(n)表示nnn这个范围之内的答案,F(n)=dnf(d)F(n)=\sum_{d|n}f(d)F(n)=∑d∣n​f(d)(其实F=f1F=f*1F=f∗1)。

那么根据后面的数论函数的相关内容:
F=f1&lt;=&gt;Fμ=f1μ&lt;=&gt;Fμ=fϵ=fF=f*1\quad &lt;=&gt;\quad F*\mu=f*1*\mu\quad&lt;=&gt;F*\mu=f*\epsilon=fF=f∗1<=>F∗μ=f∗1∗μ<=>F∗μ=f∗ϵ=f
故:f(n)=dnμ(d)F(nd)(1)f(n)=\sum_{d|n}\mu(d)*F(\frac{n}{d})\quad(1)f(n)=∑d∣n​μ(d)∗F(dn​)(1)

如果我们规定F(n)=ndf(d)F(n)=\sum_{n|d}f(d)F(n)=∑n∣d​f(d)的话:
同理有
f(n)=ndμ(dn)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]=dAμ(d)[A = 1] = \sum_{d|A}\mu(d)[A=1]=∑d∣A​μ(d)

(虽说这个初等变换不能解决所有需要反演的问题,但是一些简单的gcdgcdgcd相关反演题用这个会容易理解容易推导。但是难题(hdu6248)什么的还是要好好构*演。

那么,如果我们要求f(n)f(n)f(n)的话,用111式或222式就可以把它转化为求另外一些函数的前缀和与数论分块问题了。。

spoj divcnt1

i=1nσ0(i)\sum_{i=1}^n\sigma_0(i)∑i=1n​σ0​(i)。 要求Θ((n))\Theta(\sqrt(n))Θ((​n))

i=1ndi1=d=1ni=1nd1=d=1nnd\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∣i​1=∑d=1n​∑i=1dn​​1=∑d=1n​dn​
数论分块。和luoguP3935luoguP3935luoguP3935一样。

一个题

i=1nj=1m[gcd(i,j)=1](n&lt;m)\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1](n&lt;m)∑i=1n​∑j=1m​[gcd(i,j)=1](n<m)

  • 利用上面的初等变换来解决问题

i=1nj=1m[gcd(i,j)=1](n&lt;m)\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1](n&lt;m)∑i=1n​∑j=1m​[gcd(i,j)=1](n<m)

=i=1nj=1mdgcd(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=1nμ(d)ndmd=\sum_{d=1}^n\mu(d)*\lfloor\frac{n}{d}\rfloor*\lfloor\frac{m}{d}\rfloor=∑d=1n​μ(d)∗⌊dn​⌋∗⌊dm​⌋
所以对ndmd\lfloor\frac{n}{d}\rfloor*\lfloor\frac{m}{d}\rfloor⌊dn​⌋∗⌊dm​⌋数论分块,计算一个μ\muμ的前缀和就好了。

luoguP2522/P3455

i=abj=cd[gcd(i,j)=k]\sum_{i=a}^b\sum_{j=c}^d[gcd(i,j)=k]∑i=ab​∑j=cd​[gcd(i,j)=k]

这个计数问题依然有前缀性质,如果我们把i,ji,ji,j这两维看成二维矩阵的话。就可以用二维前缀和来做。
所以就化为统计i=1nj=1m[gcd(i,j)=k]\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k]∑i=1n​∑j=1m​[gcd(i,j)=k]的答案
考虑把它转为上题,=i=1nkj=1mk[gcd(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 same problem!a\ same\ problem!a same problem!
O(nsqrt(n))O(nsqrt(n))O(nsqrt(n))

  • 正经反演


f(k)=i=1nj=1m[gcd(i,j)=k],F(n)=ntf(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∣t​f(t)

F(n)F(n)F(n)的意义就是含有nnn这个因子的对数。F(x)=axbx(a&lt;b)F(x)=\lfloor\frac{a}{x}\rfloor*\lfloor\frac{b}{x}\rfloor(a&lt;b)F(x)=⌊xa​⌋∗⌊xb​⌋(a<b)

根据莫反第二形式:
f(k)=ktμ(tk),F(t)=ktμ(tk)atbtf(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}\rfloorf(k)=∑k∣t​μ(kt​),F(t)=∑k∣t​μ(kt​)⌊ta​⌋∗⌊tb​⌋
tk=x\frac{t}{k}=xkt​=x,f(k)=x=1akμ(x)axkbxkf(k)=\sum_{x=1}^{\lfloor\frac{a}{k}\rfloor}\mu(x)\lfloor\frac{a}{xk}\rfloor*\lfloor\frac{b}{xk}\rfloorf(k)=∑x=1⌊ka​⌋​μ(x)⌊xka​⌋∗⌊xkb​⌋
所以对axkbxk\lfloor\frac{a}{xk}\rfloor*\lfloor\frac{b}{xk}\rfloor⌊xka​⌋∗⌊xkb​⌋数论分块就行了。

一个题

给定n,mn,mn,m,求i=1nj=1mij[gcd(i,j)==k](n&lt;m)\sum_{i=1}^n\sum_{j=1}^mij[gcd(i,j)==k](n&lt;m)∑i=1n​∑j=1m​ij[gcd(i,j)==k](n<m)

  • 用初等变换解决问题

和上面一样,我们还是考虑把是kkk的整倍数的那些i,ji,ji,j同时除以kkk
=i=1nkj=1mkij[gcd(i,j)==1]k2=\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=1nkj=1mkijdgcd(i,j)μ(d)k2=\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

=k2d=1nkd2μ(d)i=1nkdij=1mkdj=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=1nkd2μ(d)\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}d^2\mu(d)∑d=1⌊kn​⌋​d2μ(d)的前缀和,对后面那一坨数论分块算等差数列平方,最后ans=k2ans*=k^2ans∗=k2就好了。(把nk\frac{n}{k}kn​视作nnn,mk\frac{m}{k}km​视作mmm,就是有两个限制的数论分块了。)
O(n+sqrt(n))O(n+sqrt(n))O(n+sqrt(n))

  • 正经反演
一个题

i=1nj=1mlcm(i,j)\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)∑i=1n​∑j=1m​lcm(i,j)

因为,lcm(i,j)=ijgcd(i,j)lcm(i,j)=\frac{i*j}{gcd(i,j)}lcm(i,j)=gcd(i,j)i∗j​

仍然是老套路,枚举 gcd(i,j)gcd(i,j)gcd(i,j)
=d=1ni=1nj=1mijd[gcd(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∑n​i=1∑n​j=1∑m​di∗j​∗[gcd(i,j)=d]
同时除以 ddd
=d=1ni=1ndj=1mdijd[gcd(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∑n​i=1∑⌊dn​⌋​j=1∑⌊dm​⌋​i∗j∗d∗[gcd(i,j)=1]
=d=1ni=1ndj=1mdijdkgcd(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∑n​i=1∑⌊dn​⌋​j=1∑⌊dm​⌋​i∗j∗dk∣gcd(i,j)∑​μ(k)
枚举 kkk
=d=1ndk=1ndμ(k)k2i=1ndkij=1mdkj=\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∑n​dk=1∑⌊dn​⌋​μ(k)∗k2i=1∑⌊dkn​⌋​ij=1∑⌊dkm​⌋​j

发现nd\lfloor\frac{n}{d}\rfloor⌊dn​⌋是可以数论分块的,在这个数论分块里面再套一个对于nkdmdk\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{dk}\rfloor⌊kdn​⌋⌊dkm​⌋的数论分块就好了。 这样做的复杂度是O(n)O(n)O(n)。 这题通过把后面的等差数列构造新函数可以优化至O(sqrt(n))O(sqrt(n))O(sqrt(n))啦。(待update)

luoguP3327

i=1nj=1md(ij)\sum_{i=1}^n\sum_{j=1}^md(ij)∑i=1n​∑j=1m​d(ij),这里d(ij)d(ij)d(ij)表示ijijij的约数个数

首先:d(ij)=xiyj[gcd(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,ji,ji,j的一个质因子ppp,假设它在iii中的次数是eie_iei​,在jjj中的次数是eje_jej​。那么它在ijijij中的可能次数是ei+ej+1e_i+e_j+1ei​+ej​+1。而右边我们保证了x,yx,yx,y互质,意思就是ppp不可在i,ji,ji,j中同时存在。假设ppp在iii中的次数为000,在jjj中就有ej+1e_j+1ej​+1种选法。ej=0e_j=0ej​=0也同理。再减去重复的ei=ej=0e_i=e_j=0ei​=ej​=0的情况,就是ei+ej+1e_i+e_j+1ei​+ej​+1。

推导还挺妙的啊?

  • 利用初等变换

i=1nj=1md(ij)(n&lt;m)\sum_{i=1}^n\sum_{j=1}^md(ij)(n&lt;m)∑i=1n​∑j=1m​d(ij)(n<m)

=i=1nj=1mxiyj[gcd(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=1ny=1m[gcd(x,y)=1]nxmy=\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=1ny=1mdgcd(x,y)μ(d)nxmy(n&lt;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&lt;m)=∑x=1n​∑y=1m​∑d∣gcd(x,y)​μ(d)⌊xn​⌋⌊ym​⌋(n<m)

=d=1nμ(d)x=1ndy=1mdndxmdy=\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=1nμ(d)x=1ndndxy=1mdmdy=\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​⌋

这个东西居然是可以数论分块的!一开始我惊了。我们用数论分块保证ddd在[L,R][L,R][L,R]区间上保持nd\lfloor\frac{n}{d}\rfloor⌊dn​⌋和md\lfloor\frac{m}{d}\rfloor⌊dm​⌋一致。然后,我们惊讶地发现:y=1mdmdy\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{m}{dy}\rfloor∑y=1⌊dm​⌋​⌊dym​⌋是什么?它就是一个数论分块的子问题!!!!就是[1,md][1,\lfloor\frac{m}{d}\rfloor][1,⌊dm​⌋]这个前缀上的mi\lfloor\frac{m}{i}\rfloor⌊im​⌋的和!! 所以,我们O(n)O(n)O(n)筛出μ\muμ,算出其前缀和。然后O(nsqrt(n))O(nsqrt(n))O(nsqrt(n))预处理出g[i]g[i]g[i]表示[1,i][1,i][1,i]这个前缀区间的子问题答案。我们再对外面的ddd进行数论分块,可以O(1)O(1)O(1)算出解。复杂度O((n+T)sqrt(n))O((n+T)sqrt(n))O((n+T)sqrt(n))

  • 正经莫反

i=1nj=1md(ij)(n&lt;m)\sum_{i=1}^n\sum_{j=1}^md(ij)(n&lt;m)∑i=1n​∑j=1m​d(ij)(n<m)

=i=1nj=1mxiyj[gcd(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=1ny=1m[gcd(x,y)=1]nxmy=\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=1ny=1m[gcd(x,y)=k]nxmyf(k)=\sum_{x=1}^n\sum_{y=1}^m[gcd(x,y)=k]\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloorf(k)=∑x=1n​∑y=1m​[gcd(x,y)=k]⌊xn​⌋⌊ym​⌋,所以答案就是f(1)f(1)f(1)对吧。

又设F(n)=ndf(d)F(n)=\sum_{n|d}f(d)F(n)=∑n∣d​f(d),根据莫反二f(n)=ndμ(nd)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)

=ndf(d)=\sum_{n|d}f(d)=∑n∣d​f(d)

=x=1ny=1m[dgcd(x,y)]nxmy=\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=1ndy=1mdndxmdy=\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(nsqrt(n))O(nsqrt(n))O(nsqrt(n))预处理。

再看要求的答案式:f(1)=d=1nμ(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,pn,pn,p,求(i=1nj=1nijgcd(i,j))(mod p)(\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j))(mod\ p)(∑i=1n​∑j=1n​ijgcd(i,j))(mod p)

  • 60pts

根据之前那个小结论,即求i=1nj=1nijdgcd(i,j)ϕ(d)(mod p)\sum_{i=1}^n\sum_{j=1}^nij\sum_{d|gcd(i,j)}\phi(d)(mod\ p)∑i=1n​∑j=1n​ij∑d∣gcd(i,j)​ϕ(d)(mod p)

=d=1nϕ(d)i=1ndidi=1ndjd=\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=1nϕ(d)d2i=1ndii=1ndj=\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=1nϕ(d)d2(i=1ndi)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)d2\phi(d)d^2ϕ(d)d2的前缀和,数论分块乘个等差数列和的平方就好了。

O(n+sqrt(n))O(n+sqrt(n))O(n+sqrt(n)),线性筛搞出ϕ\phiϕ是瓶颈。

  • 100pts

发现i=1dϕ(d)\sum_{i=1}^d\phi(d)∑i=1d​ϕ(d)是一个积性函数前缀和?杜教筛一下就好了嘛?
(等待学完杜教筛之后再想想吧,现在就咕咕咕

luoguP5221

这题有很多做法,我考场现场想了一个不用莫反不用欧拉函数的做法。就硬是从基本原理出发推导出来了。这里谈谈莫反做法。

要求i=1nj=1nlcm(i,j)gcd(i,j)(mod P)\prod_{i=1}^n\prod_{j=1}^n{\frac{lcm(i,j)}{gcd(i,j)}}(mod\ P)∏i=1n​∏j=1n​gcd(i,j)lcm(i,j)​(mod P),PPP是个质数。

=i=1nj=1nijgcd2(i,j)(mod P)=\prod_{i=1}^n\prod_{j=1}^n{\frac{ij}{gcd^2(i,j)}}(mod\ P)=∏i=1n​∏j=1n​gcd2(i,j)ij​(mod P)

=(n!)2(i=1nj=1ngcd(i,j))2=\frac{(n!)^2}{(\prod_{i=1}^n\prod_{j=1}^ngcd(i,j))^2}=(∏i=1n​∏j=1n​gcd(i,j))2(n!)2​

显然只需要关心i=1nj=1ngcd(i,j)\prod_{i=1}^n\prod_{j=1}^ngcd(i,j)∏i=1n​∏j=1n​gcd(i,j)就好了。

既然是莫反,我们就一定要确定出来一个gcdgcdgcd的值,枚举这个值为ddd

=d=1ndi=1nj=1n[gcd(i,j)=d]=\prod_{d=1}^nd^{\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=d]}=∏d=1n​d∑i=1n​∑j=1n​[gcd(i,j)=d] 这里要对指数mod (p1)mod\ (p-1)mod (p−1)了,(希望不要求逆元啊否则就要CRT合并了QAQ)。

=d=1ndi=1ndj=1nd[gcd(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=1n​d∑i=1⌊dn​⌋​∑j=1⌊dn​⌋​[gcd(i,j)=1]

=d=1ndi=1ndj=1ndkgcd(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=1n​d∑i=1⌊dn​⌋​∑j=1⌊dn​⌋​∑k∣gcd(i,j)​μ(k)

=d=1ndk=1ndμ(k)(ndk)2=\prod_{d=1}^nd^{\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)(\lfloor\frac{n}{dk}\rfloor)^2}=∏d=1n​d∑k=1⌊dn​⌋​μ(k)(⌊dkn​⌋)2

现在,一种方案是枚举ddd,然后对里面裸数论分块。可以发现指数里面的上界是nd\lfloor\frac{n}{d}\rfloor⌊dn​⌋,显然可以对ddd再分块一次。这样二次分块O(n)O(n)O(n)。但是由于卡空间的缘故,不能再开一个阶乘数组。所以要维护两个指针移动地维护阶乘。


从数论分块到狄利克雷卷积

数论分块

对于计算i=1nni\sum_{i=1}^n{\frac{n}{i}}∑i=1n​in​,发现不同的ni\frac{n}{i}in​最多只有Θ(sqrt(n))\Theta(sqrt(n))Θ(sqrt(n))个。

小证明:对于i&lt;sqrt(n)i&lt;sqrt(n)i<sqrt(n),不同的值最多只有Θ(sqrt(n))\Theta(sqrt(n))Θ(sqrt(n))个啦。对于i&gt;=sqrt(n)i&gt;=sqrt(n)i>=sqrt(n),除一下的范围就限定在了[1,sqrt(n)][1,sqrt(n)][1,sqrt(n)]之间。得证。

结论:p,n(p&lt;=n)已知p,n(p&lt;=n)已知p,n(p<=n),那么使得ni=np\lfloor\frac{n}{i}\rfloor=\lfloor\frac{n}{p}\rfloor⌊in​⌋=⌊pn​⌋的最大的正整数iii是nnp\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,gf,gf,g为积性函数的话:
h(n)=dnf(d)g(nd)h(n)=\sum_{d|n}f(d)*g(\frac{n}{d})h(n)=∑d∣n​f(d)∗g(dn​)也是一个积性函数。
对于ni\frac{n}{i}in​这样的形式,我们如果把它数论分块之后,就要求另外一个函数的前缀和。

常见的狄利克雷卷积结论:

σ0=11\sigma_0=1*1σ0​=1∗1
证明:直接按照狄利克雷卷积的定义展开就好了。
1(n)1(n)=dn1(d)1(nd)=dn1=σ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∣n​1(d)∗1(dn​)=∑d∣n​1=σ0​(n)

σ1=I1\sigma_1=I*1σ1​=I∗1
证明:化式子过程
I(n)1(n)=dnI(d)1(nd)=dnd=σ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∣n​I(d)∗1(dn​)=∑d∣n​d=σ1​(n)

I=ϕ1I=\phi*1I=ϕ∗1
证明:化式子
ϕ(n)1(n)=dnϕ(d)1(nd)=dnϕ(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)

小结论:dnϕ(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
证明:考虑右边,由于111这个东西始终是111,所以右边卷起来就是nnn的所有因子的μ\muμ和。根据前面的定理,自然等于ϵ(n)\epsilon(n)。ϵ(n)。

fϵ=ff*\epsilon=ff∗ϵ=f
证明:考虑左边,只有当d=nd=nd=n的时候才会有ϵ(nd)=1\epsilon(\frac{n}{d})=1ϵ(dn​)=1,只有这一项才会有贡献。

狄利克雷卷积有交换律,对加法的分配律,结合律
狄里克雷卷积的逆?构造
上一篇:周志明论架构之道:从SOA时代到微服务时代(2)


下一篇:周志明论架构之道:从SOA时代到微服务时代(3)