数论/线性代数 tricks
数论
https://www.cnblogs.com/deus-ex-machina/articles/18727777
逆元
众所周知,费马小定理和欧拉定理可用于求逆元。这里按下不表。
线性求逆元
给出一种线性批量预处理逆元的方法。先求出这些数的前缀乘积,对最后一个求逆元再倒推回这些数的前缀积的逆元,然后把 \(inv(s_i)\) 除以 \(s_{i-1}\) 即可得到 \(inv(a_i)\)。
gcd 相关
求解 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n\gcd(i,j)\)
\(O(n\log n)\) 做法
将原式转化为 \(\sum\limits_{k=1}^nk\sum\limits_{i=1}^n\sum\limits_{j=1}^n[gcd(i,j)=k]\),然后令 \(f_k\) 表示 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n[gcd(i,j)=k]\)。
我们会发现 \(f_i=(\cfrac{n}{i})^2-\sum\limits_{i|j,i\ne j}f_j\)。于是是调和级数的复杂度。
\((a,b)\rightarrow (a,a+b)/(a+b,b)\)
洛谷P2090 数字对 是其典型例题,将上述转换过程变为逆推求 \(\gcd\)。
哥德巴赫猜想
哥德巴赫猜想在信息学范围内可以被视作定理。
例题: 将 \(1\sim n\) 分成尽可能少的集合,使得每个集合的元素和均为质数。\(1\le n\le 60000\)
做法: 如果可以分到同一段就分,否则:如果取出一个质数,构成 \(2\) 组就可行的话,就这么做。否则答案一定 \(>2\),我们取出总和为 \(3\) 的一组(\(\{1,2\}\) 或者 \(\{3\}\)),根据哥德巴赫猜想,剩下的部分一定能分为两组。
质因子
一
一个 \(V\) 以下的数不会有超过一个 \(>\sqrt{V}\) 的质因子。\(O(\sqrt{V})\) 的质因数分解就是使用了这一原理。
这个原理还可以用于一些质因子覆盖问题。(如要选一些数字使得它们的乘积是 \(X\) 的倍数,也就是覆盖所有 \(X\) 的质因子)典型的例题有 P2150 [NOI2015] 寿司晚宴。
二
非常简单地,\(q^n-i\) 和 \(i\) 含有的 \(q\) 因子数一样多,其中 \(n\) 是任意整数,\(q\) 是一质数。可以推出 \(\prod\limits_{i=n-k+1}^{n}i\) 与 \(k!\) 含有的 \(q\) 因子数一样多。
三
若一个数的质因数分解为 \(p_1^{k_1}p_2^{k_2}\dots p_n^{k_n}\),那么它的因数之和是 \((\sum\limits_{i=0}^{k_1}p_1^i)(\sum\limits_{i=0}^{k_2}p_2^i)\dots(\sum\limits_{i=0}^{k_n}p_n^i)\)。可以用等比数列求和公式快速计算。
整系数方程的有理根
整系数方程 \(a_0+a_1x+a_2x^2+\dots+a_nx^n=0\) 的有理根 \(\dfrac{p}{q}\) 满足 \(p\mid a_0\) 且 \(q\mid a_0\)。
证明:
因为 \(\gcd(p,q)=1\),所以 \(p\mid a_0\)
同理可得 \(q\mid a_n\)。
分数试根技巧
https://www.luogu.com.cn/article/64x3t03p
Diriclet卷积 和 莫比乌斯反演
https://www.cnblogs.com/deus-ex-machina/articles/19094983
高维前缀和 - Diriclet 卷积、FWT的另一种理解方式
考虑把一个数表示为一个无穷维的向量,第 \(i\) 维表示第 \(i\) 个质数的次数。
那么,把一个数卷积上 全 \(1\) 数组,即 \(g(x)=\sum\limits_{d|x}f_d\),其可以被理解成:对于在每一个素数维度上做前缀和。伪代码:
for p in Prime
for i from 1 to n/p
a[i*p]+=a[i];
这样做可以以 \(O(n\log \log n)\) 的复杂度(埃氏筛复杂度)。
反过来说,我们使用高维差分可以理解 卷积上莫比乌斯函数 \(\mu\) 的情况。这里需要使用容斥原理的思想,即 \(f(S)=\sum\limits_{T\subset S}(-1)^{|S|-|T|} g(T)\),其中 \(g(S)=\sum\limits_{T\subset S}f(T)\)。我们可以使用这一方式相似地推出,在每一素数维度上,
\(\begin{equation} \mu_p(x)= \begin{cases} 1& , x=0\\ -1&, x=1 \\ 0 &, x\ge 2 \end{cases} \end{equation}\)
将每个数所有质因子对应的 \(\mu\) 函数乘起来,就得到了这个数的 \(\mu\) 函数,其实就是容斥系数。
同理,我们也可以用这种思路来理解FWT。(吗?
数论推导技巧
对于和 diriclet 卷积有关的推导,可以运用以下技巧。
- 欧拉反演(一种莫比乌斯反演):\([\gcd(a,b)=1]=\sum\limits_{d|a,d|b}\mu (d)\)。在此之后,一般把 \(d\) 的枚举放到最外面一层。
- 换元法:两个变量相乘被多次使用,且一些在分母,一些在分子的情况下(或者说是单个使用,可以被理解为在分子),可以把这些换元成一个数 \(T\),以构成diriclet卷积的形式。注意换元之后,要加上条件 \([d|T,k|T]\)。最常见的是枚举GCD \(g\) 和 欧拉反演的变量 \(d\),\(gd\) 出现很多,形如 \(\sum\limits_{d=1}^nd\sum\limits_{k=1}^{\frac{n}{d}}\mu(k)\lfloor\dfrac{n}{dk}\rfloor\),就可变成 \(\sum\limits_{d=1}^nd\sum\limits_{d|T}^{n}\mu(\dfrac{T}{d})\lfloor\dfrac{n}{T}\rfloor\),就可以使用diriclet卷积了。
组合数学
一些常用技巧
\(\binom{i}{n}=\binom{n-i}{n}\)
卢卡斯定理
https://www.luogu.com.cn/article/5qqdedda
矩阵
矩阵套矩阵
例题 P10502 Matrix Power Series。这题如果 \(A\) 是整数那么可以用矩阵快速幂构造 \(\begin{bmatrix} A & 1 \\ 0 & 1 \end{bmatrix}\) 求解。那么我们只需把这里的数字都换成矩阵就行了。
筛法和枚举
一个枚举思维:枚举答案的时候,如果答案不会太大,考虑只枚举答案不枚举不是答案的部分。
例题:模拟赛题目
放在这道题上是一个trick:请问有多少对整数 \(x,y\) 满足 \(1\le x\le n\) 且 \(1\le y\le m\) 且 \(\exists k\in N_+, xy=k^2\) ;一个等价的问题 \((\sqrt x +\sqrt y)^2\in N_+\)。
做法有两种:线性的,把 \(a\) 质因数分解,设置一个集合 \(S\) 表示出现奇数次的质因子,那么能够与 \(a\) 匹配产生贡献的数的 \(S\) 一定和它的 \(S\) 相同。复杂度未知的(或许是 \(O(ans)\) ),枚举两个完全平方数 \(i^2,j^2\) 作为 \(x,y\) 的基底,然后枚举一个共同的倍数 \(k\) ,这样一来两个数字的质因数分解的奇次项就互相抵消了,预先统计上 \(x==y\) 的减少复杂度,最后注意 \(i==j\) 或者 \(gcd(i^2,j^2)>1\) 时应该不统计避免重复。另外还有一种思路我没看明白:teleport。
多项式科技
各种变换
FFT 与 NTT
FWT
似乎有个类似的东西叫做FMT,但是我不会。
我的博客。
杂项
Cantor 展开
Cantor 展开用于计算一个排列的序号(在所有同一长度的排列中)。使用树状数组的话,复杂度为 \(O(n\log n)\)。
枚举第 \(i\) 位,计算出前 \(i-1\) 位与本排列相同,第 \(i\) 位小于 本排列的排列数量(注意必须合法,不能与前面的位相同,这个需要用树状数组实现)。上述所有 \(i\) 的结果之和就是小于本排列的排列的数目。可以从进制的角度理解,阶乘进制。看看参考资料。
逆康托展开就可以理解为进制的逆转换。可以用树状数组二分(单log)(或者线段树)维护集合中第 \(k\) 大的数字。
自适应辛普森
用于快速估计一个函数的定积分。洛谷上有原题。
对于一个区间,拟合为一个二次函数,如果发现不接近就递归下去,分成许多子区间去作相似的计算。

浙公网安备 33010602011771号