数论/线性代数 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\)

证明:

\[\sum\limits_{i=0}^n a_i(\frac{p}{q})^i=0 \]

\[\sum\limits_{i=0}^n a_i p^i q^{n-i}=0 \]

\[(\sum\limits_{i=0}^n a_i p^i q^{n-i})\bmod p=0 \]

\[a_0q^n\equiv 0\pmod p \]

因为 \(\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

多项式科技

我的一点心得

生成函数入门 by snowycat1234

多项式计数杂谈 by command-block

各种变换

FFT 与 NTT

我的博客

Alex_Wei的博客

FWT

似乎有个类似的东西叫做FMT,但是我不会。

我的博客

杂项

Cantor 展开

Cantor 展开用于计算一个排列的序号(在所有同一长度的排列中)。使用树状数组的话,复杂度为 \(O(n\log n)\)

枚举第 \(i\) 位,计算出前 \(i-1\) 位与本排列相同,第 \(i\) 位小于 本排列的排列数量(注意必须合法,不能与前面的位相同,这个需要用树状数组实现)。上述所有 \(i\) 的结果之和就是小于本排列的排列的数目。可以从进制的角度理解,阶乘进制。看看参考资料

逆康托展开就可以理解为进制的逆转换。可以用树状数组二分(单log)(或者线段树)维护集合中第 \(k\) 大的数字。

自适应辛普森

用于快速估计一个函数的定积分。洛谷上有原题。

对于一个区间,拟合为一个二次函数,如果发现不接近就递归下去,分成许多子区间去作相似的计算。

posted @ 2025-03-10 23:12  Luke_li  阅读(30)  评论(0)    收藏  举报