• 整除分块

Q : Q: Q: 请以 O ( N ) O(\sqrt{N}) O(N ) 的时间复杂度求解下式 <munderover> i = 1 N </munderover> N i \sum_{i=1}^N\lfloor\frac{N}{i}\rfloor i=1NiN

A : A: A: N i \lfloor\frac{N}{i}\rfloor iN 这个数列是 呈块状连续分布 的, 设某个块的 左端点 l l l, 则这个块的 右端点 N N / l \frac{N}{N/l} N/lN (向下取整略) ,
于是该块的和为 ( r l + 1 ) N l (r-l+1)*\lfloor\frac{N}{l}\rfloor (rl+1)lN,

代码很简短:

for(reg int l = 1, r; l <= N; l = r+1){
		r = N/(N/l);
   		tmp += (r-l+1)*(N/l);
}

  • 莫比乌斯函数

: 定义: :

n = p 1 k 1 p 2 k 2 . . . . . . p m k m n=p_1^{k_1}*p_2^{k_2}......p_m^{k_m} n=p1k1p2k2......pmkm

μ ( n ) = { <mstyle displaystyle="false" scriptlevel="0"> 1 <mtext>                 </mtext> n = 1 </mstyle> <mstyle displaystyle="false" scriptlevel="0"> ( 1 ) m <mtext>        </mtext> i = 1 m k i = 1 </mstyle> <mstyle displaystyle="false" scriptlevel="0"> 0 <mtext>                  </mtext> e l s e </mstyle> \mu(n)= \begin{cases} 1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ n=1 \\ (-1)^m \ \ \ \ \ \ \prod_{i=1}^mk_i=1\\ 0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else \end{cases} μ(n)=1               n=1(1)m      i=1mki=10                else

可以看出有 1 单个质因子的幂数超过1 1 的数字 莫比乌斯函数 值为 0 0 0 .


: 性质: :

1 : 性质1: 1: 莫比乌斯函数是 积性函数 :

μ ( a b ) = μ ( a ) μ ( b ) <mtext>         </mtext> g c d ( a , b ) = 1 \mu(a*b)=\mu(a)*\mu(b)\ \ \ \ \ \ \ gcd(a,b)=1 μ(ab)=μ(a)μ(b)       gcd(a,b)=1

根据这个性质, 可以 O ( N ) O(N) O(N) 进行 线性筛,

  • 若当前数字 i i i 为质数, μ ( i ) = 1 \mu(i)=-1 μ(i)=1,

  • i % p j <mtext>   </mtext> = = 0 i\%p_j\ == 0 i%pj ==0, 说明 i p j i*p_j ipj 已经含有幂数大于 1 1 1的质因子, 所以 μ ( i p j ) = 0 \mu(i*p_j)=0 μ(ipj)=0,

  • 否则说明 i i i 的质因子与 p j p_j pj 共同构成 i p j i*p_j ipj的质因子,
    于是 μ ( i p j ) = μ ( p j ) μ ( i ) = μ ( i ) \mu(i*p_j)=\mu(p_j)*\mu(i)=-\mu(i) μ(ipj)=μ(pj)μ(i)=μ(i),
    这个式子同时处理了 μ ( i ) = 0 \mu(i)=0 μ(i)=0的情况 .

void sieve(){
        mu[1] = 1, p_cnt = 0;
        for(reg int i = 2; i < maxn; i ++){
                if(!Used[i]) p[++ p_cnt] = i, mu[i] = -1;
                for(reg int j = 1; j <= p_cnt && i*p[j] < maxn; j ++){
                        Used[i*p[j]] = 1;
                        if(i%p[j] == 0){ mu[i*p[j]] = 0; break ; }
                        else mu[i*p[j]] = -mu[i];
                }
        }
}

2 : 性质2: 2:
<munder> d N </munder> μ ( d ) = [ N = = 1 ] \sum_{d|N}\mu(d)=[N==1] dNμ(d)=[N==1]

证明:
  • N = 1 N=1 N=1 时, μ ( 1 ) = 1 \mu(1)=1 μ(1)=1.

  • N ! = 1 N!=1 N!=1 时,
    N = p 1 k 1 p 2 k 2 . . . . . . p m k m N=p_1^{k_1}*p_2^{k_2}......p_m^{k_m} N=p1k1p2k2......pmkm, d = p 1 q 1 p 2 q 2 . . . . . . p m q m d=p_1^{q_1}*p_2^{q_2}......p_m^{q_m} d=p1q1p2q2......pmqm,
    由于 质因子幂 大于 1 1 1 μ \mu μ 值为 0 0 0, 所以只需考虑 幂 为 0 , 1 0,1 0,1 的质因子项,
    <munder> d N </munder> μ ( d ) = <munderover> i = 0 m </munderover> ( <mstyle displaystyle="false" scriptlevel="0"> m </mstyle> <mstyle displaystyle="false" scriptlevel="0"> i </mstyle> ) ( 1 ) i \sum_{d|N}\mu(d)=\sum_{i=0}^m \begin{pmatrix}m \\ i\end{pmatrix}*(-1)^i dNμ(d)=i=0m(mi)(1)i
    因为有 二项式定理, 所以
    = <munderover> i = 0 m </munderover> ( <mstyle displaystyle="false" scriptlevel="0"> m </mstyle> <mstyle displaystyle="false" scriptlevel="0"> i </mstyle> ) ( 1 ) i 1 m i <mtext>   </mtext> = ( 1 1 ) m <mtext>   </mtext> = 0 原式 = \sum_{i=0}^m \begin{pmatrix}m \\ i\end{pmatrix}*(-1)^i*1^{m-i}\\ \ \\ =(1-1)^m\\ \ \\ =0 =i=0m(mi)(1)i1mi =(11)m =0

证毕.

: 二项式定理: : ( x + y ) n = <munderover> k = 0 n </munderover> ( <mstyle displaystyle="false" scriptlevel="0"> m </mstyle> <mstyle displaystyle="false" scriptlevel="0"> i </mstyle> ) x n k y n (x+y)^n=\sum_{k=0}^{n}\begin{pmatrix}m \\ i\end{pmatrix}x^{n-k}y^n (x+y)n=k=0n(mi)xnkyn


  • 莫比乌斯反演

f ( n ) , g ( n ) f(n),g(n) f(n),g(n) 为数论函数, 且
f ( N ) = <munder> d N </munder> g ( d ) f(N)=\sum_{d|N}g(d) f(N)=dNg(d)

莫比乌斯反演 为:
g ( d ) = <munder> d N </munder> μ ( N d ) f ( d ) <mtext>    </mtext> <mtext>    </mtext> <munder> d N </munder> μ ( d ) f ( N d ) g(d)=\sum_{d|N}\mu(\frac{N}{d})f(d)\ \ 或者\ \ \sum_{d|N}\mu(d)f(\frac{N}{d}) g(d)=dNμ(dN)f(d)    dNμ(d)f(dN)

证明:

<munder> d N </munder> μ ( d ) f ( N d ) <mtext>   </mtext> = <munder> d N </munder> μ ( d ) <munder> i N d </munder> g ( i ) <mtext>   </mtext> <mtext>   </mtext> = <munder> i N </munder> g ( i ) <munder> k N i </munder> μ ( k ) <mtext>   </mtext> = g ( N ) \sum_{d|N}\mu(d)f(\frac{N}{d})\\ \ \\ = \sum_{d|N}\mu(d)\sum_{i|\frac{N}{d}}g(i) \ \\ \ \\ = \sum_{i|N} g(i) \sum_{k|\frac{N}{i}} \mu(k) \\ \ \\ = g(N) dNμ(d)f(dN) =dNμ(d)idNg(i)  =iNg(i)kiNμ(k) =g(N)

证毕.

说一下从第二步到怎么到第三步的,
先看第二步推导的含义: 枚举 N N N 的约数 d d d, 然后再去找与 μ ( d ) \mu(d) μ(d) 相乘的 g ( i ) g(i) g(i),
分析 d d d i i i 之间的关系, i t = N d i*t = \frac{N}{d} it=dN ( t t t 为正整数), 进而得到 d t = N i d*t=\frac{N}{i} dt=iN, 即 d N i d|\frac{N}{i} diN ,
于是枚举 i i i, 再枚举 N i \frac{N}{i} iN 的约数进行计算, 即第三步


  • 莫比乌斯反演的变形

F ( x ) = <munderover> d = 1 N x </munderover> g ( d x ) F(x)=\sum_{d=1}^{\lfloor \frac{N}{x} \rfloor}g(dx) F(x)=d=1xNg(dx)

g ( x ) = <munderover> d = 1 N x </munderover> F ( d x ) μ ( d ) g(x)=\sum_{d=1}^{\lfloor \frac{N}{x} \rfloor}F(dx)\mu(d) g(x)=d=1xNF(dx)μ(d)

: 证明: :

<munderover> d = 1 N x </munderover> F ( d x ) μ ( d ) = <munderover> d = 1 N x </munderover> μ ( d ) <munderover> i = 1 N d x </munderover> g ( i d x ) \sum_{d=1}^{\lfloor \frac{N}{x} \rfloor}F(dx)\mu(d)\\ = \sum_{d=1}^{\lfloor \frac{N}{x} \rfloor} \mu(d) \sum_{i=1}^{\lfloor\frac{N}{dx}\rfloor} g(i*dx)\\ d=1xNF(dx)μ(d)=d=1xNμ(d)i=1dxNg(idx)

i d = t <mtext>    </mtext> ( t [ 1 , N x ] ) i*d=t\ \ (t∈[1,\lfloor\frac{N}{x}\rfloor]) id=t  (t[1,xN]), 则 d = t / i d = t/i d=t/i, 即 d t d|t dt.
即与 F ( t x ) F(tx) F(tx) 进行运算的是 μ ( t / i ) \mu(t/i) μ(t/i) .
于是枚举 t t t, 得到

= <munderover> t = 1 N x </munderover> g ( t x ) <munder> d t </munder> μ ( d ) = g ( x ) 原式 = \sum_{t=1}^{\lfloor\frac{N}{x}\rfloor}g(tx)\sum_{d|t}\mu(d)\\ = g(x) =t=1xNg(tx)dtμ(d)=g(x)
证毕.


  • 莫比乌斯反演的应用

<mstyle mathcolor="blue"> g c d ( i , j ) = 1 </mstyle> \color{blue}{求解gcd(i,j)=1的对数} gcd(i,j)=1

: 解法 : :

<mlabeledtr> <mtext> (1) </mtext> <munderover> i = 1 n </munderover> <munderover> j = 1 m </munderover> [ g c d ( i , j ) = 1 ] <mtext>            </mtext> ( n &lt; m ) </mlabeledtr> \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1]\ \ \ \ \ \ \ \ \ \ (n&lt;m) \tag{1} i=1nj=1m[gcd(i,j)=1]          (n<m)(1)

前面提到莫比乌斯函数的 性质2: <munder> i N </munder> μ ( i ) = [ N = = 1 ] \sum_{i|N}\mu(i)=[N==1] iNμ(i)=[N==1]

N N N 换成 g c d ( i , j ) gcd(i,j) gcd(i,j) 得到 : <munder> i g c d ( i , j ) </munder> μ ( i ) = [ g c d ( i , j ) = 1 ] \sum_{i|gcd(i,j)}\mu(i)=[gcd(i,j)=1] igcd(i,j)μ(i)=[gcd(i,j)=1]

再代入 1 1 1 式: <munderover> i = 1 n </munderover> <munderover> j = 1 m </munderover> <munder> d g c d ( i , j ) </munder> μ ( d ) \sum_{i=1}^n\sum_{j=1}^m\sum_{d|gcd(i,j)}\mu(d) i=1nj=1mdgcd(i,j)μ(d)

再将 d d d 提出来 :

<munderover> d = 1 n </munderover> n d m d μ ( d ) \sum_{d=1}^{n}\lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor \mu(d) d=1ndndmμ(d)


<mstyle mathcolor="blue"> g c d ( i , j ) = k </mstyle> \color{blue}{求解gcd(i,j)=k的对数} gcd(i,j)=k

1 : 解法 1: 1:

将上方式子 n , m n,m n,m 换为 n k , m k \lfloor \frac{n}{k} \rfloor, \lfloor \frac{m}{k} \rfloor kn,km 即可.

2 : 解法 2: 2:

前面提到莫比乌斯反演的 变形:

F ( x ) = d = 1 N x g ( d x ) F(x)=\sum_{d=1}^{\frac{N}{x}}g(dx) F(x)=d=1xNg(dx), 则 g ( x ) = d = 1 N x F ( d x ) μ ( d ) g(x)=\sum_{d=1}^{\frac{N}{x}}F(dx)\mu(d) g(x)=d=1xNF(dx)μ(d),

于是设 f ( k ) f(k) f(k) g c d ( i , j ) = k gcd(i,j)=k gcd(i,j)=k 的对数, g ( k ) g(k) g(k) k g c d ( i , j ) k|gcd(i,j) kgcd(i,j) 的对数, 显然有
g ( k ) = <munderover> i = 1 N k </munderover> f ( i k ) = n k m k g(k)=\sum_{i=1}^{\lfloor\frac{N}{k}\rfloor}f(i*k) = \lfloor \frac{n}{k} \rfloor \lfloor \frac{m}{k} \rfloor g(k)=i=1kNf(ik)=knkm
于是参照 莫比乌斯反演的变形. 得到
f ( k ) = <munderover> x = 1 N k </munderover> g ( k x ) μ ( x ) = <munderover> x = 1 N k </munderover> n k x m k x μ ( x ) f(k) = \sum_{x=1}^{\lfloor\frac{N}{k}\rfloor}g(kx)\mu(x)\\ = \sum_{x=1}^{\lfloor\frac{N}{k}\rfloor}\lfloor \frac{n}{kx} \rfloor \lfloor \frac{m}{kx} \rfloor \mu(x) f(k)=x=1kNg(kx)μ(x)=x=1kNkxnkxmμ(x)


: 再提整除分块: :

n k x m k x \lfloor \frac{n}{kx} \rfloor \lfloor \frac{m}{kx} \rfloor kxnkxm 整除分块时, 要保证块内 n k x m k x \lfloor \frac{n}{kx} \rfloor \lfloor \frac{m}{kx} \rfloor kxnkxm 相同, 每次可能就需要一个指针 “委曲求全”,
具体的说:
一个指针同时处理 n , m n,m n,m 的块, 从起点 1 1 1出发, 则下一步需要走到 r = m i n ( n / ( n / l ) , m / ( m / l ) ) r=min(n/(n/l), m/(m/l)) r=min(n/(n/l),m/(m/l)).


<mstyle mathcolor="blue"> g c d ( i , j ) </mstyle> \color{blue}{求解gcd(i,j)的幂} gcd(i,j)

<munderover> i = 1 N </munderover> <munderover> j = 1 M </munderover> g c d ( i , j ) k \sum_{i=1}^N\sum_{j=1}^Mgcd(i,j)^k i=1Nj=1Mgcd(i,j)k

: 解法 : :
待填坑…