zoukankan      html  css  js  c++  java
  • @总结


    @0 - 引言@

    我发现学习数学要记住的东西实在太多了。。。
    所以专门开一个 blog 来整理收集一下。
    该篇博客应该会时刻保持 update。

    如果是太过简单的东西就不予证明了。

    @1 - 欧几里得算法@

    @1.1 - 欧几里得算法@

    作用:用于求解两个整数的最大公因数。

    从最基础的开始吧。
    这个算法又被叫作“辗转相除法”,非常生动形象地表现了这个算法的流程。

    只需要一句话就可以描述:

    [gcd(a, b) = gcd(b, a mod b) ]

    时间复杂度初步估计为 O(log n)。据说斐波拉契数列可以卡到 gcd 的最大时间。

    @1.2 - 扩展欧几里得算法@

    作用:用于求解模线性方程:kx = a (mod m)。

    现在,我们来看一个比较难(?)的算法吧。
    稍微变化一下就可以等价的变为 kx + my = a。

    显然 gcd(k, m) 如果不是 a 的因数,则无解。
    如果我们求解 kx' + my' = gcd(k, m) ,可以得到 x = x'(a/gcd(k,m)), y = y'(a/gcd(k,m))。
    我们仿照 gcd 的求法,稍微进行变换:

    [kx_0 + my_0 = gcd(k, m) = gcd(m, k mod m) = mx_1 + (k mod m)y_1 ]

    [kx_0 + my_0 = mx_1 + (k - m*lfloor frac{k}{m} floor)y_1 ]

    [k(x_0 - y_1) + m(y_0 - x_1 + lfloor frac{k}{m} floor y_1) = 0 ]

    注意我们现在只需要求出一组特解,而代入 (x_0 = y_1, y_0 = x_1 - lfloor frac{k}{m} floor y_1) 即可使等式成立。

    该算法和欧几里得算法一样只需要 O(log n) 的时间即可得出一组特解。

    令 t = gcd(k, m),则可以得到通解 x = x0 + a*m/t, y = y0 - a*k/t。
    求解通解(包括下面的涉及求解通解的算法)有一个常规的方法,假设存在另一组解,寻找两组解之间的关系。

    @1.3 - 类欧几里得算法@

    作用:用于求解 (sum_{i=0}^{n}i^{k1} imeslfloorfrac{a imes i+b}{c} floor^{k2})

    咕咕咕。update in 2020/03/10:我来填坑啦。

    一份参考资料。

    除了模板题,我们平常大概只需要用到 (sum_{i=0}^{n}lfloorfrac{a imes i+b}{c} floor)。不过有的时候理性愉悦一下也是挺好的。

    我们定义函数 func(n, a, b, c) 可以求出 k1 + k2 <= K 的所有 (sum_{i=0}^{n}i^{k1} imeslfloorfrac{a imes i+b}{c} floor^{k2}) 的值。

    (1)如果 (a geq c)
    此时有(为了方便,暂时用 % 代替取模符号):

    [sum_{i=0}^{n}i^{k1} imeslfloorfrac{a imes i+b}{c} floor^{k2} = sum_{i=0}^{n}i^{k1} imes(lfloorfrac{a}{c} floor imes i + lfloorfrac{(a\%c) imes i+b}{c} floor)^{k2} ]

    简单二项式展开可得:

    [sum_{i=0}^{n}i^{k1}lfloorfrac{a imes i+b}{c} floor^{k2} = sum_{i=0}^{n}sum_{p=0}^{k2}{k2 choose p} imeslfloorfrac{a}{c} floor^p imes i^{k1+p} imes lfloorfrac{(a\%c) imes i+b}{c} floor^{k2-p} ]

    递归到 func(n, a%c, b, c) 即可。

    (2)如果 (b geq c)
    类似于上面的推导,我们有:

    [sum_{i=0}^{n}i^{k1}lfloorfrac{a imes i+b}{c} floor^{k2} = sum_{i=0}^{n}sum_{p=0}^{k2}{k2 choose p} imeslfloorfrac{b}{c} floor^p imes i^{k1} imes lfloorfrac{a imes i+(b\%c)}{c} floor^{k2-p} ]

    递归到 func(n, a, b%c, c) 即可。

    (3)如果 (a < c)(b < c)
    此时记 (m = lfloorfrac{a imes n+b}{c} floor)

    首先判断 m 是否为 0。如果 m = 0,则当 k2 ≠ 0 时答案为 0,否则答案为自然数幂和。
    否则,此时肯定有 a ≠ 0。

    先引入一个恒等式:([j + 1 leq lfloorfrac{a imes i + b}{c} floor] = 1 - [i leq lfloorfrac{c imes j + c - b - 1}{a} floor])
    证明需要用到两条引理:(a imes b leq c Leftrightarrow a leq lfloorfrac{c}{b} floor)(a imes b > c Leftrightarrow a > lfloorfrac{c}{b} floor)。此处不细谈。

    我们可以将 (lfloorfrac{a imes i+b}{c} floor^{k2}) 写作 (sum_{j=0}^{lfloorfrac{a imes i+b}{c} floor - 1}((j + 1)^{k2} - j^{k2}))。尝试对原式变形:

    [sum_{i=0}^{n}i^{k1}lfloorfrac{a imes i+b}{c} floor^{k2} = sum_{i=0}^{n}i^{k1}sum_{j=0}^{lfloorfrac{a imes i+b}{c} floor - 1}((j + 1)^{k2} - j^{k2})\ = sum_{j=0}^{m - 1}((j + 1)^{k2} - j^{k2})sum_{i=0}^{n}[j + 1 leq lfloorfrac{a imes i + b}{c} floor] imes i^{k1}\ = sum_{j=0}^{m - 1}((j + 1)^{k2} - j^{k2})sum_{i=0}^{n}(1 - [i leq lfloorfrac{c imes j + c - b - 1}{a} floor]) imes i^{k1}\ = sum_{j=0}^{m - 1}((j + 1)^{k2} - j^{k2})sum_{i=0}^{n}i^{k1} - sum_{j=0}^{m - 1}((j + 1)^{k2} - j^{k2})sum_{i=0}^{lfloorfrac{c imes j + c - b - 1}{a} floor}i^{k1}\ = m^{k2}sum_{i=0}^{n}i^{k1} - sum_{j=0}^{m - 1}sum_{p=0}^{k2 - 1}{k2choose p}j^psum_{i=0}^{lfloorfrac{c imes j + c - b - 1}{a} floor}i^{k1} ]

    。。。看起来很糟但其实每一步都是很简单的变换。

    注意到自然数幂和 (sum_{i=0}^{n}i^k) 可以表示成 n 的 k + 1 次多项式 (F_k(n) = sum_{i=0}^{k+1}f_{k,i}n^i)

    [sum_{j=0}^{m - 1}sum_{p=0}^{k2 - 1}{k2choose p}j^psum_{i=0}^{lfloorfrac{c imes j + c - b - 1}{a} floor}i^{k1} = sum_{p=0}^{k2 - 1}sum_{q=0}^{k1 + 1}{k2choose p}f_{k1, q}sum_{j=0}^{m - 1}j^p imeslfloorfrac{c imes j + c - b - 1}{a} floor^{q} ]

    因此递归到 func(n, c, c - b - 1, a) 即可。

    上述过程有一个不严谨的地方,就是当 k2 = 0 时某些式子不一定成立。
    不过推导结果适用于 k2 = 0 的情况就是了。

    最后是时间复杂度。可以通过观察 a, c 两项发现是 (a, c) -> (a % c, c) -> (c, a % c) 的过程,因此递归次数和 gcd 一样(也就只有这一点和 gcd 一样。。。)
    然后算上 K 的话一次复杂度为 O(K^4*log)。

    建议一看的模板题。

    @2 - 逆元@

    作用:实现模意义下的除法。

    比较简单的一个东西,大概主要是为后面作铺垫。
    可以发现模意义下是不可以直接除的,但是我们可以通过两边同时乘以 a 的逆元来间接实现除法。
    比如 (ab = c),两边同时乘 (a) 的逆元 (a^{-1}) 可以得到 (b = c*a^{-1})

    可以发现逆元是满足 (ax = 1) 的解,所以直接扩欧即可。
    另外,根据我们即将要讲的费马小定理/欧拉定理 (a^{phi(m)} = 1mod m),就可以得到 (a^{phi(m)-1} = 1mod m)

    预处理多个数的逆元还有着均摊 O(1) 的算法,也有两种方法:
    一种是处理 1~n 的逆元,可以采用以下方法推导:

    [令 m = lfloorfrac{m}{p} floor*p + mmod p = k*p + r ]

    [k*p + r = 0 mod m ]

    [r = -k*p -> p^{-1} = -k*r^{-1} ]

    因为 r 始终小于 p,所以就可以递推求出 p 的逆元。初始条件 1 的逆元为 1。

    还有一种适用于求解任意 n 个数的逆元的方法。
    我们先求出 n 个数的前缀积,记为 S[i],然后我们通过扩欧或者其他什么的求解出 S[n] 的逆元。
    因为 (S[i]*A[i+1] = S[i+1]),所以 (frac{A[i+1]}{S[i+1]} = frac{1}{S[i]}),即我们可以线性递推出所有前缀积的逆元。
    又因为 (frac{S[i]}{S[i+1]} = frac{1}{A[i+1]}) 所以又可以求解出所有数的逆元。

    @3 - 中国剩余定理@

    @3.1 - 中国剩余定理@

    作用:求解模数互质情况下的模线性方程组。

    我们通过扩欧算法解决了模线性方程,而通过这个算法我们就可以解决模线性方程组。

    已知 (x = a_0 mod m_0, x = a_1 mod m_1, ..., x = a_n (mod m_n))
    如果 mi 之间两两互质,则可以仿照拉格朗日插值的方法得到 x 的解。

    (M = m_0*m_1*...*m_n),再记 (inv(a, m)) 表示模 m 意义下 a 的逆元,则:

    [x = sum_{i=0}^{n}a_i*frac{M}{m_i}*inv(frac{M}{m_i}, m_i) mod M ]

    只需要证明这是一组特解与通解也具有这种形式即可。

    @3.2 - 扩展中国剩余定理@

    作用:求解任意模数的模线性方程组。

    这个时候就不能用插值的思想来做了。
    为简化问题,我们不妨先只考虑两个方程组成的方程组,记这两个方程为 x = a0 mod m0, x = a1 mod m1。

    首先我们将其等价地写为 x = m0*p + a0, x = m1*q + a1。
    于是我们就有 x = m0*p + a0 = m1*q + a1,稍微变形可以得到扩欧的基本形式之一 m0*p - m1*q = (a1 - a0)。
    通过上面的理论,该方程可以解得 p = b0 + k0*t, q = b1 + k1*t。
    将 p 代入最开始的式子,可以得到 x = m0*(b0 + k0*t) + a0 = m0*b0 + a0 + m0*k0*t。
    于是就有 x = m0*b0 + a0 mod m0*k0。

    根据如上的推导,我们可以每次将两个方程合并,直到只剩下一个方程为止。
    注意这中间的扩欧可能是会无解的,此时整个方程组也无解。

    @4 - 欧拉定理@

    @4.1 - 费马小定理@

    作用:在模数是质数的情况下,用于指数的取模、求解逆元。

    定理的描述只有一个公式:

    [a^{p-1} = 1 mod p ]

    其中 p 是质数。使用条件只需要 a 不是 p 的倍数即可。
    稍微变化一下就可以得到 a 的逆元 (a^{p-2} = a^{-1} mod p)
    一般情况下写费马小定理比写扩欧要快得多,而且快速幂本身作为一个基础功能也可以用于其他地方。

    指数取模的意思是 (a^b = a^{bmod p-1} mod p),至于正确性是很显然的。

    证明需要用到剩余系什么的,因为过于数论所以就暂且不提。

    @4.2 - 欧拉定理@

    作用:在模数与底数互质的情况下,用于指数的取模、求解逆元。

    定理的描述一样只有一个公式:

    [a^{phi(m)-1} = 1 mod m ]

    适用条件是 gcd(a, m) = 1。可以发现这也是扩欧有解的条件。
    取 m 为质数,则 (phi(m) = m - 1)。于是费马小定理就是欧拉定理的一个特例。
    但是因为欧拉函数 (phi) 并不好求,所以一般实用性不如费马小定理。

    证明一样要用什么既约剩余系,太过于数论所以暂且不提。

    @4.3 - 扩展欧拉定理@

    作用:用于指数的取模。

    这个定理相比上述两条不需要任何的适用条件,具有普适性。描述如下:

    [a^{p} = a^{phi(m) + pmod phi(m)}mod m ]

    证明提及一下简要的过程。首先我们从 m 中提取某个质因子 p,使得 m = s*p^r(其中 s 与 p 互质)。然后:

    [p^{phi(s)} = 1 mod s ]

    [p^{phi(m)} = 1 mod s(由积性函数的性质) ]

    [p^{k*phi(m)} = 1 mod s ]

    [p^{k*phi(m) + r} = p^r mod s*p^r = p^r mod m ]

    将 a 也拆成质因子相乘的形式,如果 a 的某个质因子 m 不含有就套用欧拉定理,否则如上所示。

    @5 - 离散对数@

    @5.1 - 原根@

    作用:理论依据。

    阶是满足 (a^p = 1mod m) 的最小正整数 p(显然要求 gcd(a, m) = 1)。
    我们需要的有关阶的性质一般只用得着 (p|phi(m)) 这一个。

    模 m 意义下的原根 g 的阶为 (phi(m))。或者说,对于 0 < i <= phi(m) 满足 g^i 的值互不相同。
    怎么检验一个原根呢?貌似按照定义需要检验 1~phi(m) 的所有数作为幂。
    但是我们有阶一定是 (phi(m)) 的因数。考虑进行唯一分解: (phi(m) = p_0^{a_0}*p_1^{a_1}*...)
    于是如果 x 的阶不为 (phi(m)),则存在一个 i 使得 (x^{frac{phi(m)}{p_i}} = 1 mod m)
    然后就可以比较快地检验原根。至于寻找原根可以采用枚举 + 检验的方法。

    原根还有一些其他性质,比如当模数为 2, 4, p^a, 2*p^a 时才有原根,以及原根个数为 (phi(phi(m))) 个。

    通过原根 g 可以将所有数表示为 g^p 的形式,实现在模意义下的“对数”。也即是 离散对数 或 指标。
    于是就可以将乘法转为加法,将模型进行转化(比如将下标作乘法的卷积变为下标作加法的卷积然后 fft)。

    @5.2 - BSGS(大步小步法)@

    作用:在模数为质数的要求下求解离散对数 a^x = b mod p。

    刚刚我们介绍了原根,但是即使使用原根也没有什么高效的算法。事实上,这个问题也没什么高效的解法(比如线性或对数时间复杂度)
    不过我们可以写一个勉强可以接受的时间复杂度:(O(sqrt{p}))
    看到这个时间复杂度想必大家都知道应该怎么做了:分块。

    我们令 (c = sqrt{p}, x = kc - b(1 le b le c, k ge 1))(注意这里是减法,因为用减法下面的推导更为方便)(还要注意两个参数的取值范围,只有这样才能全覆盖)。
    则可以得到 (A^{kc-b} = Bmod p),稍作变换可得 (A^{kc} = B*A^{b}mod p)
    注意等式左边与右边分别只有根号种取值。我们将右边的所有可能值预处理出来存入 hash 中,然后再枚举左边并在 hash 中寻找。

    暴力而优雅的分块。

    @5.3 - exBSGS(扩展大步小步法)@

    作用:任意模数下求解离散对数 a^x = b mod p。

    事实上不带扩展的版本可以解决 gcd(a, p) = 1 的情况。
    主要的问题是当 gcd(a, p) ≠ 1 时,a 的逆元不一定存在。

    令 t = gcd(a, p),我们尝试在等式两边及模数同时除以 t,得到 (frac{a}{t}*a^{x-1} = frac{b}{t} mod frac{p}{t})
    此时因为 a/t 与 p/t 互质,所以有 (a^{x-1} = frac{b}{t}*(frac{a}{t})^{-1}mod frac{p}{t})
    于是就可以这样迭代到 a 与新的模数 p' 互质然后使用 BSGS 即可。

    然而这个过程有两个问题:
    一是,当 t 不能整除 b 时会出现问题;二是,a 上的指数在不断减,如果真正的解小于迭代次数(比如 x = 0)会出问题。

    当 b = 1 时,其实存在解 x = 0。当 b 不为 1 也不为 t 的倍数时,无解。因此我们解决了第一个问题。
    我们通过特判 b = 1,就可以避免我们的第二个问题:因为所有可能的解要么在最后的 BSGS 中求解出来,要么在特判时求解出来。

    实现中可以不用真的去求 (frac{a}{t}) 的逆元,用一些等价的方法判断即可。

    @6 - 高次剩余@

    这个我会的也不是很多。。。数论学得不太好。。。

    @6.1 - 利用离散对数@

    作用:有原根的情况下求解高次剩余 x^a = n mod p。

    将 x 和 b 都表示为原根的幂,得到:

    [g^{y*a} = g^{k}mod p ]

    根据上面的什么欧拉定理就可以指数取模,然后得到一个模线性方程,然后 exgcd 即可。

    @6.2 - 二次剩余@

    作用:模数为素数的情况下求解二次剩余 x^2 = n mod p。

    首先素数分 2 和奇素数。2 不必多说,我们接下来只考虑奇素数。

    先来看看怎么判断一个数 k 是否为二次剩余。由费马小定理我们有 (k^{p-1}=1mod p),于是就有 (k^{frac{p-1}{2}} = 1或-1mod p)
    假设 k 有二次剩余 x,则有 (k^{frac{p-1}{2}} = x^{p-1} = 1mod p)
    假设 (k^{frac{p-1}{2}} = 1mod p),用原根表示 k 得到 (g^{{frac{p-1}{2}}*a} = 1 = g^{p-1} mod p),所以 a 为偶数,所以 (g^{frac{a}{2}}) 是 k 的二次剩余。
    我们就得到了 k 是二次剩余的充要条件。这个好像叫作欧拉准则。

    随机一个 a,取 w = a^2 - n。我们要随机出一个合适的 a 使得 w 为非二次剩余。
    因为二次剩余与非二次剩余的数量相同,所以期望 2 次就可以找到这样一个 a。
    然后求 ((a+sqrt{w})^{frac{p+1}{2}}) 就可以得到 n 的二次剩余。
    这里的 (a+sqrt{w}) 可以类比复数中的 (i=sqrt{-1}) 来理解。

    为什么?首先我们证明 ((a+sqrt{w})^{p+1} = n)
    因为 ((a+sqrt{w})^p = a^p + sqrt{w}^p + sum_{i=1}^{p-1}C_p^ia^i*sqrt{w}^{p-i}),又因为 (C_p^i) 一定是 p 的倍数(因为 p 是素数),所以就可以得到 ((a+sqrt{w})^p = a^p + sqrt{w}^p)
    由于 w 是非二次剩余,所以就有 (w^{frac{p-1}{2}} = sqrt{w}^{p-1} = -1)。又因费马小定理可得 (a^p = a),所以原式变为 (a - sqrt{w})
    所以 ((a+sqrt{w})^{p+1} = (a+sqrt{w})(a - sqrt{w}) = a^2 - w = n)

    再证明 ((a+sqrt{w})^{frac{p+1}{2}})(sqrt{w}) 的系数为 0。
    ((a+sqrt{w})^{frac{p+1}{2}} = u + v*sqrt{w}),所以有 ((u + v*sqrt{w})^2 = u^2 + v^2*w + 2*u*v*sqrt{w} = n)
    所以 u = 0 或 v = 0 成立。我们反证,不妨假设 u = 0 而 v ≠ 0,则 (v^2*w = n)
    左边不是二次剩余,而右边是二次剩余,矛盾。

    一个 O(log n) 的算法,但是非常具有构造性。。。

    @7 - 数论函数相关@

    @7.1 - 数论函数@

    定义域为正整数,值域为复数(不过一般来说我们用的函数值域也是正整数)的函数称为数论函数

    数论函数中有一类很特殊的类型,叫做积性函数:
    若 f(x) 满足若 a, b 互质,有 f(ab) = f(a)*f(b),则称 f(x) 为积性函数。
    积性函数有一个很重要的性质:假如将 x 唯一因数分解得到 x = p1a1*p2a2*...*pk^ak,则积性函数 f(x) = f(p1a1)*f(p2a2)*...*f(pk^ak)。

    常见的积性函数有如下几个:
    (phi(n)) - 欧拉函数:n 以内的与 n 互质的数。
    (mu(n)) - 莫比乌斯函数:n 中如果有平方因子则为 0;否则假如 n 中有偶数个质因子则为 1,有奇数个质因子则为 -1。
    (d(n)) - 因子个数函数:n 的因子个数。
    (sigma(n)) - 因子和函数:n 的因子之和。

    积性函数中有一类很特殊的类型,叫做完全积性函数:
    若 f(x) 满足对于任意 a, b,有 f(ab) = f(a)*f(b),则称 f(x) 为完全积性函数。
    完全积性函数有一个很重要的性质:假如将 x 唯一因数分解得到 x = p1a1*p2a2*...*pk^ak,则完全积性函数 f(x) = f(p1)a1*f(p2)a2*...*f(pk)^ak。

    常见的完全积性函数有如下几个:
    (I(n)) - 恒等函数:始终为 1。
    (id(n)) - 单位函数:始终为 n。
    (e(n)) - 元函数:等于 [n = 1](即 n = 1 时为 1,否则为 0)。

    @7.2 - 狄利克雷卷积@

    事实上,狄利克雷卷积与数论函数是密不可分的。

    简单来说,狄利克雷卷积是定义在数论函数上的卷积,是数论函数特有的运算。
    它的定义如下:

    [(f*g)(n) = sum_{d|n}f(d)·g(frac nd) ]

    与一般的卷积类似,狄利克雷卷积满足交换律与结合律。
    且狄利克雷卷积存在单位元,即 e(x)。

    积性函数的狄利克雷卷积依然是积性函数,这个性质在我们遇到某些陌生的函数时可以通过线性筛解决。

    常见的一些狄利克雷卷积结果:
    (1)(mu*I = e),可以通过组合数恒等式得到。
    (2)(phi*I = id),构造集合 S1 = {1/n, 2/n, ... n/n},再构造 S2 为 S1 中各分数化为既约分数,即可通过 |S1| = |S2| 证明。
    (3)(mu*id = phi),这个可以根据(1)(2)合在一起得到。
    (4)(I*I = d)(I*d = sigma),根据定义可轻易得证。
    (5)(mu*d = I)(mu*sigma = d),其实与 (4) 等价。

    还有一个与 (phi) 相关的常用性质因为我实在不知道放哪里所以就放在这里好了
    与 n 互质的数之和 (S = frac{n*phi(n)+[n=1]}{2})。因为若 gcd(n, i) = 1,则 gcd(n, n - i) = 1。

    update 2020/09/09:数论函数还可以通过狄利克雷级数(类似于数论中的生成函数)(F(s)=sum_{n=1} f_n n^{-s}) 来理解。

    比如:(zeta(s) = sum_{n=1} n^{-s}),为 (I) 的狄利克雷级数;(zeta(s-k) = sum n^{-s+k} = sum n^k imes n^{-s}),为 (id^k) 的狄利克雷级数。

    两个狄利克雷级数相乘 (F(s) imes G(s)) 即对应数论函数的狄利克雷卷积,由此也可以得到 (frac{1}{zeta(s)}=sum mu(n) imes n^{-s})(frac{zeta(s-1)}{zeta(s)}=sum phi(n) imes n^{-s})

    狄利克雷级数给出了数论函数的一种封闭形式。对于积性函数,我们还可以定义其贝尔级数 (f_p(z) = sum f(p^i)z^i),其中 (p) 是个质数,这给出了另一种封闭形式。

    比如:(I_p(z)=frac{1}{1-z})(mu_p(z) = 1 - z)(phi_p(z)=frac{1-z}{1-pz})。那么该级数相乘也对应了狄利克雷卷积(其实我也是今天才知道)

    @7.3 - 莫比乌斯反演@

    事实上,我们一般所说的莫比乌斯反演有两种形式:

    形式 1:已知 (g(n)=sum_{d|n}f(d)),则 (f(n)=sum_{d|n}mu(d)g(frac{n}{d}))
    形式 2:已知 (g(n)=sum_{n|d}f(d)),则 (f(n)=sum_{n|d}mu(d)g(frac{n}{d}))

    由狄利克雷卷积很容易理解形式 1。
    但是从偏序关系的角度来讲,其实两者是等价的——仅仅只是调换偏序关系的两边而已。
    当然你从容斥的角度也可以理解。

    一般来说,我们用莫比乌斯反演主要是两种情况:
    一种根据定义,题目给出的函数真的长得就是一副可以反演的函数。
    另一种是含 gcd(i, j) 的式子,我们可以令 gcd(i, j) = x,将和式乘上 [gcd(i, j) = x]。然后将 [gcd(i, j) = x] 直接反演成 [gcd(i, j)|x]。
    对于第二种,举个小例子。

    当然也不要见到什么含有 gcd 的数论题就开始莫比乌斯反演,举个例子:
    (sum_{i=1}^{n}sum_{j=1}^{n} gcd(i, j))。此时就可以先枚举 gcd(i, j) 的取值 x,然后就是求 1~n/x 之中的互质对数。
    然后相当于求 (2*sum_{i=1}^{n/x}sum_{j=1}^{i}[gcd(i, j) = 1] - 1),其实就是欧拉函数的定义 (2*sum_{i=1}^{n/x}phi(i) - 1)

    @8 - 各类筛法@

    可以看这一篇博客查看更多详情。

    @9 - 大数素性测试与因数分解@

    详情可以点击这篇博客。

    @10 - 组合数取模@

    @10.1 - lucas 定理@

    作用:模数 p 为素数的情况下求解组合数取模 C(n, m) mod p。

    假如我们要求一个组合数取模的结果 (C_{n}^{m} mod p),其中 p 是一个质数。
    lucas 定理表明了以下关系的存在:

    [C_{n}^{m} = C_{n/p}^{m/p}*C_{n\%p}^{m\%p} mod p ]

    其中证明。。。百度百科里面提到了一个构造性的证明,但为了与下面的扩展 lucas 定理统一,我们采用另一个证明。
    首先有:

    [C_{n}^{m} = frac{n!}{m!*(n-m)!} = frac{1*2*...*n}{1*2*...*m*1*2*...*(n-m)} ]

    为了得到它取模的结果,我们需要讨论分子分母中质数因子 p 的出现。
    我们提取出分子分母 p 的倍数,得到:

    [C_{n}^{m} = frac{((p-1)!)^{frac{n}{p}}*p^{frac{n}{p}}*(frac{n}{p})!*(n\%p)!}{((p-1)!)^{frac{m}{p}}*p^{frac{m}{p}}*(frac{m}{p})!*(m\%p)!*((p-1)!)^{frac{n-m}{p}}*p^{frac{n-m}{p}}*(frac{n-m}{p})!*((n-m)\%p)!} ]

    (不要怕,这个公式只是看起来长而已。。。)
    其中表达式中的除法表示向下取整。

    可以发现,只有当 (lfloorfrac{n-m}{p} floor + lfloorfrac{m}{p} floor = lfloorfrac{n}{p} floor),这个式子在模 p 的意义下才有意义。
    我们可以把阶乘组合一下得到组合数,此时原式就可以变为:

    [C_{n}^{m} = frac{(frac{n}{p})!*(n\%p)!}{(frac{m}{p})!*(m\%p)!*(frac{n-m}{p})!*((n-m)\%p)!} = C_{n/p}^{m/p}*C_{n\%p}^{m\%p} ]

    于是可以通过预处理 < p 的阶乘,在 O(log) 的时间内解决组合数取模问题。

    @10.2 - 扩展 lucas 定理@

    作用:模数 p 为任意数的情况下求解组合数取模 C(n, m) mod p。
    懒得再写一遍,大家直接打开这篇博客看吧。

    @11 - burnside 引理@

    终于从数论中脱离出来了。。。
    你可以在这篇博客里找到详情。

    @12 - 整数拆分@

    作用:求将 n 拆分成若干个正整数之和的方案数(无顺序、可重复)

    写出正整数拆分的生成函数:

    [F(x) = prod_{i=1}(x^{0 imes i} + x^{1 imes i} + x^{2 imes i} + dots)\ = prod_{i=1}frac{1}{1 - x^i} ]

    考虑函数 (Phi(x) = prod_{i=1}(1 - x^i))(没错又是个欧拉函数)。它的组合意义为 “将 n 拆分成偶数个不同的正整数方案数” - “将 n 拆分成奇数个不同的正整数方案数”。

    数形结合,我们使用 ferrers 图像描述整数拆分(可左转百科)。不过因为要求拆分成不同的正整数,所以每一行必须严格短于上一行。

    举一个例子:
    o o o o o o
    o o o o o
    o o o

    我们记 p 为最靠右一条对角线上元素数量(上例中为 2),q 为最后一行元素数量(上例中为 3)。
    定义一个变换:当 p < q 时,将最靠右的对角线挪到最后一行下方;当 p >= q 时,将最后一行挪到最右边作为新的对角线。
    举两个变换的例子:

    变换前
    o o o o o x
    o o o o x
    o o o
    变换后
    o o o o o
    o o o o
    o o o
    x x

    变换前
    o o o o o o o
    o o o o o o
    o o o o o
    x x x
    变换后
    o o o o o o o x
    o o o o o o x
    o o o o o x

    可以清楚地发现该变换是可逆,而变换一次行数的奇偶性就改变了。那么每一个奇数拆分对应了一个偶数拆分,因此差为 0。。。?

    存在以下两类图变换后不合法:
    o o o o o
    o o o o
    o o o

    o o o o o o
    o o o o o
    o o o o

    满足的性质:首先两张图都满足 p = 行数,除此之外第一张图满足 p = q;而第二张图满足 p = q - 1。
    那么第一张图的总点数(被拆分数)n = (3*p - 1)*p/2;而第二张图 n = (3*p + 1)*p/2。

    由此就可以得到 (Phi(x) = prod_{i=1}(1 - x^i) = sum_{p=1}(-1)^px^{frac{p(3ppm 1)}{2}})。接着你也就可以解出 (F(x) = frac{1}{Phi(x)})

    这里有一个点。你可以直接多项式求逆,不过注意到 (Phi(x)) 的表达式中 x 的幂成二次函数增长,因此 n 项中只有 (sqrt{n}) 项有值。因此也可以作 (O(nsqrt{n})) 的多项式求逆。

    一个变式是,有时候它会限制每种数最多用 k 次,此时生成函数为 (F(x) = prod_{i=1}frac{1 - x^{k+1}}{1 - x^i} = frac{Phi(x^{k+1})}{Phi(x)})。还是该咋求咋求。

    不限制使用次数的模板题限制使用次数的模板题

    @13 - 二项式反演@

    [egin{aligned} f_n &= sum_{i=0}^{n}{nchoose i}g_i\ g_n &= sum_{i=0}^{n}(-1)^{n-i}{nchoose i}f_i end{aligned} ]

    以及:

    [egin{aligned} f_n &= sum_{i=n}{ichoose n}g_i\ g_n &= sum_{i=n}(-1)^{i-n}{ichoose n}f_i end{aligned} ]

    从卷积的角度来看,上下两式的结构一致,只是卷积类型不同。

    证明可以采用生成函数,也可以上式代入下式算。
    我们就用代入法证一下第一种形式吧,第二种类似证明即可。

    [egin{aligned} g_n &= sum_{i=0}^{n}(-1)^{n-i}{nchoose i}f_i \ &= sum_{i=0}^{n}(-1)^{n-i}{nchoose i}sum_{j=0}^{i}{ichoose j}g_j \ &= sum_{j=0}^{n}g_j{nchoose j}sum_{i=j}^{n}(-1)^{n-i}{n - jchoose i - j}\ &= sum_{j=0}^{n}g_j{nchoose j}(-1)^{j} imes(1+(-1))^{n-j} \ &= g_n end{aligned} ]

    其实只是背下来过后推式子可以直接写,不用再推导一遍。

    14 - 数值积分(自适应simpson法)

    simpson 法:简单来说就是二次函数(一次函数是直的,用来拟合弯的太为难它了)拟合原函数求积分。

    对于区间 ([L, R]),取中点 (M) 得到原函数上三点 ((L, f(L)), (M, f(M)), (R, f(R)))
    设过这三点的二次函数为 (g(x) = Ax^2 + Bx + C),有:

    [egin{aligned} int_{L}^{R}f(x)dx &sim int_{L}^{R}g(x)dx \ &=frac{2A(R^3 - L^3)+3B(R^2-L^2)+6C(R-L)}{6} \ &=frac{R-L}{6} imes(2AR^2+2ALR+2AL^2+3BR+3BL+6C) \ &=frac{R-L}{6} imes[(AL^2+BL+C)+(AR^2+BR+C)+4(AM^2+BM+C)] \ &=frac{R-L}{6} imes(f(L) + f(R) + 4f(M)) end{aligned} ]

    自适应 simpson 法:平衡精度与时间的方法。简单来说,如果 [L, R] 的拟合值与 [L, M] + [M, R] 相差可以接受,则认为拟合值可接受;否则分治递归。

    模板题(请尽量不要自己手算不定积分),以及模板:

    double f(double x) {/*...*/}
    double simpson(double L, double R) {
    	double M = (L + R) / 2;
    	return (R - L) / 6 * (f(L) + f(R) + 4*f(M));
    }
    double integral(double L, double R) {
    	double M = (L + R) / 2;
    	if( fabs(simpson(L, M) + simpson(M, R) - simpson(L, R)) < EPS )
    		return simpson(L, R);
    	else return integral(L, M) + integral(M, R);
    }
    

    15 - 拉格朗日乘子法

    对于单变量函数 (y=f(x)),欲求其极值,可以令其导数 (frac{dy}{dx} = 0) 并解出对应的点。

    对于多变量函数 (y=f(x_1,x_2,dots,x_n)),欲求其极值,可以令其所有偏导 (frac{partial y}{partial x_i} = 0) 并解出对应的点。

    对于带有约束 (g(x_1,x_2,dots,x_n)=0) 的多变量函数 (y=f(x_1,x_2,dots,x_n)),欲求其极值。

    我们想要规约到不带约束的情况。注意到不带约束时极值满足 (frac{partial y}{partial x_i} = 0),尝试构造 (g(x_1,x_2,dots,x_n)=frac{partial y}{partial lambda} = 0)

    构造成 (y=f(x_1,x_2,dots,x_n)-lambda g(x_1,x_2,dots,x_n)) 即可,此时有 (frac{partial y}{partial lambda} = g(x_1,x_2,dots,x_n))

    如果有多个约束条件,对于每个条件设个 (lambda_i) 即可。

    其实只是因为我在做文化课时看到了一道不等式,发现我不会(

    大概是已知 (ax+by=cxy),求 (px+qy) 的最小值(当然 (a,b,c,p,q) 是已知的常数,(x,y) 是正数)

    你的中学数学老师会教你变形 (frac{a}{y}+frac{b}{x}=c),那么 (px+qy=frac{1}{c}(frac{a}{y}+frac{b}{x})(px+qy)),展开均值不等式。

    然后显然这道题拉格朗日乘子法也可以做,令 (g(x,y)=ax+by-cxy=0),目标函数 (f(x,y) = px + qy)

    虽然算起来很麻烦(

  • 相关阅读:
    AFN的使用(待整理)
    [转]文件上传进度显示
    图片上传在线预览
    Mysql中文乱码,修改字符集
    struts2 实现自定义标签
    设置HTML和JSP页面不缓存的方法
    Spring framework3.2整合hibernate4.1报错:No Session found for current thread
    Java用SAX解析XML
    js操作Cookie
    php创建缩略图
  • 原文地址:https://www.cnblogs.com/Tiw-Air-OAO/p/11166793.html
Copyright © 2011-2022 走看看