zoukankan      html  css  js  c++  java
  • 莫比乌斯反演学习笔记


    • 整除分块

    Q:Q: 请以 O(N)O(sqrt{N}) 的时间复杂度求解下式 i=1NNisum_{i=1}^Nlfloorfrac{N}{i} floor

    A:A: Nilfloorfrac{N}{i} floor 这个数列是 呈块状连续分布 的, 设某个块的 左端点ll, 则这个块的 右端点NN/lfrac{N}{N/l} (向下取整略) ,
    于是该块的和为 (rl+1)Nl(r-l+1)*lfloorfrac{N}{l} floor,

    代码很简短:

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

    • 莫比乌斯函数

    :定义:

    n=p1k1p2k2......pmkmn=p_1^{k_1}*p_2^{k_2}......p_m^{k_m}

    μ(n)={1               n=1(1)m      i=1mki=10                elsemu(n)= egin{cases} 1 n=1 \ (-1)^m prod_{i=1}^mk_i=1\ 0 else end{cases}

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


    :性质:

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

    μ(ab)=μ(a)μ(b)       gcd(a,b)=1mu(a*b)=mu(a)*mu(b) gcd(a,b)=1

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

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

    • i%pj ==0i\%p_j == 0, 说明 ipji*p_j 已经含有幂数大于11的质因子, 所以μ(ipj)=0mu(i*p_j)=0,

    • 否则说明 ii 的质因子与 pjp_j 共同构成 ipji*p_j的质因子,
      于是 μ(ipj)=μ(pj)μ(i)=μ(i)mu(i*p_j)=mu(p_j)*mu(i)=-mu(i),
      这个式子同时处理了 μ(i)=0mu(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:
    dNμ(d)=[N==1]sum_{d|N}mu(d)=[N==1]

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

    • N!=1N!=1 时,
      N=p1k1p2k2......pmkmN=p_1^{k_1}*p_2^{k_2}......p_m^{k_m}, d=p1q1p2q2......pmqmd=p_1^{q_1}*p_2^{q_2}......p_m^{q_m},
      由于 质因子幂 大于 11μmu 值为 00, 所以只需考虑 幂 为 0,10,1 的质因子项,
      dNμ(d)=i=0m(mi)(1)isum_{d|N}mu(d)=sum_{i=0}^m egin{pmatrix}m \ iend{pmatrix}*(-1)^i
      因为有 二项式定理, 所以
      =i=0m(mi)(1)i1mi =(11)m =0原式 = sum_{i=0}^m egin{pmatrix}m \ iend{pmatrix}*(-1)^i*1^{m-i}\ \ =(1-1)^m\ \ =0

    证毕.

    :二项式定理: (x+y)n=k=0n(ni)xnkyn(x+y)^n=sum_{k=0}^{n}egin{pmatrix}n \ iend{pmatrix}x^{n-k}y^n


    • 莫比乌斯反演

    f(n),g(n)f(n),g(n) 为数论函数, 且
    f(N)=dNg(d)f(N)=sum_{d|N}g(d)

    莫比乌斯反演 为:
    g(d)=dNμ(Nd)f(d)    dNμ(d)f(Nd)g(d)=sum_{d|N}mu(frac{N}{d})f(d) 或者 sum_{d|N}mu(d)f(frac{N}{d})

    证明:

    dNμ(d)f(Nd) =dNμ(d)iNdg(i)  =iNg(i)kNiμ(k) =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)

    证毕.

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


    • 莫比乌斯反演的变形

    F(x)=d=1Nxg(dx)F(x)=sum_{d=1}^{lfloor frac{N}{x} floor}g(dx)

    g(x)=d=1NxF(dx)μ(d)g(x)=sum_{d=1}^{lfloor frac{N}{x} floor}F(dx)mu(d)

    :证明:

    d=1NxF(dx)μ(d)=d=1Nxμ(d)i=1Ndxg(idx)sum_{d=1}^{lfloor frac{N}{x} floor}F(dx)mu(d)\ = sum_{d=1}^{lfloor frac{N}{x} floor} mu(d) sum_{i=1}^{lfloorfrac{N}{dx} floor} g(i*dx)\

    id=t  (t[1,Nx])i*d=t (t∈[1,lfloorfrac{N}{x} floor]), 则 d=t/id = t/i, 即 dtd|t.
    即与 F(tx)F(tx) 进行运算的是 μ(t/i)mu(t/i) .
    于是枚举 tt, 得到

    =t=1Nxg(tx)dtμ(d)=g(x)原式 = sum_{t=1}^{lfloorfrac{N}{x} floor}g(tx)sum_{d|t}mu(d)\ = g(x)
    证毕.


    • 莫比乌斯反演的应用

    gcd(i,j)=1color{blue}{求解gcd(i,j)=1的对数}

    :解法 :

    i=1nj=1m[gcd(i,j)=1]          (n<m)(1)sum_{i=1}^nsum_{j=1}^m[gcd(i,j)=1] (n<m) ag{1}

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

    NN 换成 gcd(i,j)gcd(i,j) 得到 : igcd(i,j)μ(i)=[gcd(i,j)=1]sum_{i|gcd(i,j)}mu(i)=[gcd(i,j)=1]

    再代入 11 式: i=1nj=1mdgcd(i,j)μ(d)sum_{i=1}^nsum_{j=1}^msum_{d|gcd(i,j)}mu(d)

    再将 dd 提出来 :

    d=1nndmdμ(d)sum_{d=1}^{n}lfloor frac{n}{d} floor lfloor frac{m}{d} floor mu(d)


    gcd(i,j)=kcolor{blue}{求解gcd(i,j)=k的对数}

    1:解法 1:

    将上方式子n,mn,m 换为 nk,mklfloor frac{n}{k} floor, lfloor frac{m}{k} floor 即可.

    2:解法 2:

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

    F(x)=d=1Nxg(dx)F(x)=sum_{d=1}^{frac{N}{x}}g(dx), 则 g(x)=d=1NxF(dx)μ(d)g(x)=sum_{d=1}^{frac{N}{x}}F(dx)mu(d),

    于是设 f(k)f(k)gcd(i,j)=kgcd(i,j)=k 的对数, g(k)g(k)kgcd(i,j)k|gcd(i,j) 的对数, 显然有
    g(k)=i=1Nkf(ik)=nkmkg(k)=sum_{i=1}^{lfloorfrac{N}{k} floor}f(i*k) = lfloor frac{n}{k} floor lfloor frac{m}{k} floor
    于是参照 莫比乌斯反演的变形. 得到
    f(k)=x=1Nkg(kx)μ(x)=x=1Nknkxmkxμ(x)f(k) = sum_{x=1}^{lfloorfrac{N}{k} floor}g(kx)mu(x)\ = sum_{x=1}^{lfloorfrac{N}{k} floor}lfloor frac{n}{kx} floor lfloor frac{m}{kx} floor mu(x)


    :再提整除分块:

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


    gcd(i,j)color{blue}{求解gcd(i,j)的幂}

    i=1Nj=1Mgcd(i,j)ksum_{i=1}^Nsum_{j=1}^Mgcd(i,j)^k

    :解法 :
    待填坑…
  • 相关阅读:
    merge into update
    buffer overflow
    在表中循环插入日期
    判断表是否存在 存储
    listagg( ) within group ( order by ) 与 wm_concat
    Oracle导入SQL脚本执行 scott 用户下的表删除了
    数据导入时注意点,修改登录密码不区分大小写
    分页
    创建触发器在表中播入数据时ID自动增长
    insert 另外一种用法
  • 原文地址:https://www.cnblogs.com/zbr162/p/11822562.html
Copyright © 2011-2022 走看看