zoukankan      html  css  js  c++  java
  • [模板] 数论题的一些经验

    数论题多为一些求和/求值的题目, 多数可以通过莫比乌斯反演/筛法/恒等式等方法来解决.

    下面是一些人生经验.

    (epsilon(n) = [n=1]), (I(n) = 1), (id(n) = n), (S(n) = sum_{i=1}^n i = frac{n(n+1)}2).

    1. 基本的点积/卷积:

      • (f * epsilon = f cdot I = f)
      • (I * I = d)
      • (id * id = id cdot d)
      • ((f cdot id) * id = id cdot (f * I))
    2. 卷积的性质: [1]1

      • 交换律, 结合律, 对加法分配律
      • 完全积性函数, 点积对卷积有分配律:
        (f) 完全积性 (如 (id), (I)), 那么有 (f cdot (g * h) = (g cdot f) * (h cdot f))
      • 逆运算:
        • 对于数论函数 (f)(f(1) ot= 0), 存在 (g) 为其逆函数, 即 (f * g = epsilon);
        • 特别的, (mu * I = epsilon), 即 (mu)(I) 的逆函数
    3. 关于函数的积性

      • 积性函数的卷积是积性函数.
      • 积性函数 (f(x)), (g(x)).
        (A(x) = f cdot g = f(x)g(x)) 是积性函数,
        (B(x) = (f cdot g) * 1 = sum_{i|x} f(i)g(i)) 也为积性函数.
    4. 有关 (phi)(mu)

      • (phi * I = id) (替换n)
      • (mu * I = epsilon) (替换[n=1])
      • (mu * id = phi) (一般用到这个公式的时候都说明做麻烦了)
      • ((phi cdot id^k) * id^k = id^{k+1} quad (forall k ge 0))
      • ((mu cdot id^k) * id^k = epsilon quad (forall k ge 0))
      • (P_s(v)) 表示 (v) 的质因子集合, 则若 (P_s(a) supseteq P_s(b)), 有 (phi(ab) = phi(a) * b)
        • (phi (i^k) = i^{k-1} phi(i))
      • (sigma=sigma*epsilon=(I*id)*(I*mu)=(I*I)*(id*mu)=d*phi)
        • (sigma) 为约数和函数, 即 (sigma = id * I)
    5. 求值方法:

      • 正常方法(莫反/筛法)
      • 调和级数(O(n log n))
      • (sum_{i=1}^n frac n{i^2} = O(frac{pi^2}6 cdot n) sim O(n))
      • 积性函数筛((O(n)))/单点求值((O(log n * T)))
      • 关于卷积 (h = f*g) 的线性筛: [2]2
        • 形式化的, 有

        [h(n) = egin{cases} 1 & ext{if} & n = 1 \ sum_{d=0}^{k} f(p^d) g(p^{k-d}) & ext{if} & n = p^k \ h(p^k)h(m) & ext{else let} & n = p^k m & ext{where} & gcd(p^k, m) = 1 end{cases} ]

        • 对于第二部分, 可以 (O(k)) 暴力维护.
        • [2] 中证明了这样的总时间复杂度为 (O(n)).
    6. [sum_{i=1}^n i cdot [(i,n)=1] = frac{phi(n)*n+epsilon(n)}2 = egin{cases} 1 & (n=1) \ frac{phi(n)*n}2 & (n>1) end{cases} ]

    7. (n=prod_{i=1}^k p_i^{alpha_i}), 有

      [sum_{d|n} mu (d) cdot d = prod_{i=1}^k (1-p_i) ]

    8. (约数个数和)

      [d(ij)=sum_{x|i}sum_{y|j}[(x,y)==1] ]

    9. (约数研究)

      [sum_{i=1}^n left[ frac{n}{i} ight] = sum_{i=1}^n d(i) ]

    10. (luogu4902 乘积)
      (a_i = left[ frac{n}{i} ight]). 若 (x ightarrow (x + 1)), 那么

      [a_i' = egin{cases} a_i & (i mid (x+1)) \ a_i + 1 & (i mid (x+1)) end{cases} ]

    11. 有关约数的复杂度

      [sum_{i=1}^n d(i) = O(nlog n) ]

      (调和级数)

      [sum_{i=1}^n d^2(i) = O(nlog^3 n) ]

      (据 hihocoder #1867: GCD; 不会证)

    12. 其他的复杂度

      • (n le 10^8), (d(n) le 800)
      • (n le 10^{18}), (d(n) le 10^5)
      • (n le 10^{8}), (sum_{i=1}^n phi(n) le 4*10^{14})

    参考资料

    1. Möbius inversion and Dirichlet convolution = Snakes
    2. 复杂度分析:积性函数的狄利克雷卷积 - 知乎

    1. [1] ↩︎

    2. [2] ↩︎

  • 相关阅读:
    【5.3】dict的子类
    【5.2】dict的常用方法
    【5.1】dict的abc继承关系
    【4.5】列表推导式、生成器表达式、字典推导式
    【4.4】bisect维护已排序序列
    【4.3】实现可切片的对象
    【4.2】Python序列中+、+=和extend的区别
    【4.1】Python中的序列分类
    【3.12】contextlib简化上下文管理器
    【3.11】Python中的with语句
  • 原文地址:https://www.cnblogs.com/ubospica/p/10362689.html
Copyright © 2011-2022 走看看