qbxt 数论基础笔记
欧拉定理
若 \(a,p\) 互质,则
\(a^{\phi(p)} \equiv 1(mod~p)\)
其中 \(\phi(p)\) 表示的是小于等于 \(p\) 中和 \(p\) 互质的数的个数。
\(\phi(p) = p\times \prod \frac{s_i - 1}{s_i}\) ,其中 \(s_i\) 为 \(p\) 的质因数。
不难看出,如果 \(x,y\) 互质,\(\phi(xy) = \phi(x)\phi(y)\)
扩展欧拉定理: \(a\) 和 \(b\) 可以不互质。
如果 \(b\geq \phi(p)\) 时
\(a^b \equiv a^{(b~mod~\phi(p))+\phi(p)}~mod~p\)
总结一下:
求 \(a\) 在 \(mod~p\) 意义下的逆元。
\(inv[a] = a^{\phi(p) - 1}\)
[BZOJ 3884] 上帝与集合的正确用法
求 \(2^{2^{2^{2^{2^{2^{2^{\dots}}}}}}} mod~p\)
\(1\leq T \leq 1000, 1\leq p \leq 10^7\)
solution
根据欧拉扩展定理得:
\(2^{2^{2^{2^{2^{\dots}}}}} mod~p = 2^{2^{2^{2^{2^{\dots}}}} mod~\phi(p) + \phi(p)}~~mod~~p= 2^{2^{2^{2^{2^{\dots}}}mod~\phi(\phi(p)) + \phi(p)} }~~mod~~p\dots\)
然后一直递归下去。
\(\phi(p)\sim \phi(\phi(p))\sim\phi(\phi(\phi(p)))\dots\)
\(\phi\) 的值会越来越小,最后会变到 0,后面的 2 就不用算了,然后递归回来求解就好了。
复杂度 \(O(log~p)\)
经典问题
给一个 \(n\) 需要求 \(1\sim n\) 中与 \(n\) 互质的数的和。
\(n\leq 10^{14}\)
solution
由于 \(gcd(a, n) = gcd(n - a, n)\)
所以可以把与 \(n\) 互质的数放在一起,肯定会两两配对,并且每次配对的和是 \(n\) 。
因此答案是 \(n\times \frac{\phi(n)}{2}\)。
BZOJ 2190 仪仗队
求 \(\sum_{1\leq i,j\leq N}[gcd(i, j) ~is ~1]\)
\(1\leq N \leq 40000\)
solution
可以转化为 \(2\times (\sum_{1\leq i\leq N}\phi(i) ) - 1\)
因为 \(gcd(1, 1) = 1\) 所以它算了两次,所以要 \(-1\) 。
[Codeforces 432C] Prime Swaps
给出一个长度为 \(N\) 的排列,每次你可以选择两个位置 \(i, j~(i < j)\) ,并交换上面的数,前提是 \(j - i + 1\) 是质数。
要求在 \(5N\) 次操作内,把这个序列排号。输出具体排序的操作。
\(N \leq 10^5\)
solution
哥德巴赫猜想:任一大于 \(2\) 的整数都可写成三个质数的和。
别问我为什么,欧拉好像也不会
然后每个数就都可以移动到任何一个位置了。
那么每次把一个数往前移动 \(x\) 距离时,先移动一个尽量大的质数距离即可。
贪心从 \(1,2,3,4\dots\) 的顺序排序即可。
由于质数密度为 \(ln(N)\) ,所以可以保证在 \(5N\) 次内一定能完成。
[BZOJ2818] GCD
求 \(\sum_{1\leq i,j \leq N} [gcd(i,j)~is~ prime]\)
\(1 \leq N \leq 10^7\)
solution
对于每一个质数,对答案的贡献就是 \(\sum_{1\leq i,j \leq \frac{N}{p}} [gcd(i,j) = 1]\)。
[BZOJ2705] Longge的问题
求 \(\sum_{1\leq i \leq N} gcd(i, N)\)
\(1 \leq N \leq 2^{32}\)
solution
主要思想时枚举一个 \(N\) 的因数,假设为 \(5\) ,那么就找出 \(1\sim N\) 中所有与 \(N\) 的 \(gcd\)
为 \(5\) 的数的个数,然后乘以 \(5\) 就是这个因数的贡献,对每个因数做一遍就是答案。
枚举所有的 \(d\) ,然后用质因数分解求 \(\phi\) 就好了。
[bzoj3813] 奇数国
一个长度为 \(N\) 的序列,每个数都是前 \(60\) 小的质数之一。
两种操作一共 \(M\) 个:
- 修改一个位置的数为某前 \(60\) 小的质数之一
- 查询一个区间乘积的 \(\phi\) 值(对 \(10^7\) 取模)
\(1\leq N, M \leq 10^5\)
solution
建一棵线段树,维护区间乘积和每个素数出现的次数(二进制表示就好),然后用
\(\phi(p) = p\times \prod \frac{s_i - 1}{s_i}\) 算就好了,除法要用逆元。
最大公约数与欧几里得算法
\(gcd(a,b) = gcd(b, a\%b)\)
\(lcm(a, b) = \frac{ab}{gcd(a,b)}\)
操场是由 \(n\) 个格子围城的圆形,从 \(1\) 到 \(n\) 编号。
有 \(m\) 个同学,每个同学步长 \(a_i\) ,从 \(1\) 开始跑,求每个同学不会经过的格子数。
\(m\leq 10^5, n,a_i \leq 10^9\)
如果 \(a_i\) 与 \(n\) 互质,那么所有的格子都能踩到。
最大公约数,最小公倍数性质
扩展欧几里得
求一组不定方程。
\(ax + by = gcd(a, b)\)
推式子得到:
\(ay + b(x - \lfloor \frac{a}{b} \rfloor \times y) = gcd(a, b)\)
一直递归到最后 \(x = 1, y = 0\)
中国剩余定理
若 \(m_1, m_2, m_3……m_n\) 是两两互质的正整数,有同余方程组
\[\begin{cases} x \equiv a_1 (mod~m_1)\\ x \equiv a_2 (mod~m_2)\\ ……\\ x \equiv a_n (mod~m_n)\\ \end{cases} \]求 \(x\) ?
证明:
根据一个定理
两数不能整除,若除数扩大(或缩小)了几倍,而被除数不变,则其商和余数也同时扩大(或缩小)相同的倍数(余数必小于除数)
(证明: 假设 a % b = d,a / b = k, a = kb + d, a - kd = d,a,b 同时扩大 z 倍,得到 z(a - kd) = zd;)
所以可以得出 \(a_iM_it_i \equiv a_i(mod~~m_i)\)
显然 $ M_i$ 除了可以 \(m_i\) 之外都可以整除其他 \(m\)
\(\because \forall k \not= i,a_iM_it_i = 0(mod~m_k)\)
\(\because a_iM_it_i\equiv a_i(~mod~m_i)\)
所以带入原式得到:\(x = \sum^{n}_{i = 1}a_iM_it_i\)
整数分块
求 \(\sum_{i = 1}^{n}(\lfloor \frac{n}{i}\rfloor)^5 \times i\)
\(n \leq 10^9\) 答案对 \(10^9 + 7\) 取模。
引理一:$\lfloor \frac {n}{i} \rfloor $ 最多只有 \(2\sqrt{n}\) 种不同的取值。
证明:将 \(i\) 分为大于等于 \(\sqrt{x}\) 与大于 \(\sqrt{x}\) 的两部分
- 当 \(d \leq \sqrt{x}\) 时
此时 \(\lfloor{\frac{x}{d}}\rfloor \geq \sqrt{x}\),最多 \(\sqrt{x}\) 种取值
- 当 \(d > \sqrt{x}\) 时
\(\lfloor \frac{x}{d} \rfloor < \sqrt{x}\), 最多 \(\sqrt{x}\) 种取值
复杂度为 \(O(\sqrt{x})\)
引理二:所有$\lfloor \frac {n}{i} \rfloor $ 相同的对应的 i 一定是一段连续的区间
反证法:如果不是连续的区间
一定存在 \(l < t < r\) 使得 \(\lfloor \frac{n}{l}\rfloor = \lfloor \frac{n}{r}\rfloor\) 且\(\lfloor \frac{n}{l}\rfloor \neq \lfloor \frac{n}{t}\rfloor\)
\(\because t > l\)
\(\because \lfloor \frac{n}{t}\rfloor < \lfloor \frac{n}{l}\rfloor\)
\(\because t < r\)
\(\because \lfloor \frac{n}{t}\rfloor > \lfloor \frac{n}{r}\rfloor\)
所以假设不成立
引理三:对于所有连续的区间,如果知道了 l ,那么 r 也会知道
$r = \lfloor{\frac{n}{\lfloor\frac{n}{l}\rfloor}}\rfloor $
证明?我不会
//f(a) = a^5;
for (int i = 1, last; i <= n; i = last + 1) {
int a = n / i;
last = n / a;
ret += f(a) * (sum[last] - sum[i - 1]);
}
[HDU 5780]
求 \(\sum_{1 \leq a,b\leq n} gcd(x^a - 1, x^b - 1)\)
\(x, n \leq 10^6\)
solution
根据 \(gcd\) 的性质 \(gcd(x^a - 1, x^b - 1) = x^{gcd(a, b)} - 1\) 化简上面的式子。
得到:
\(\sum_{1 \leq a,b\leq n} x^{gcd(a,b)} - 1\)
考虑枚举 \(gcd(a, b)\)
\(\sum_{k=1}^{n}(x^k - 1) \sum_{1\leq a,b\leq n}[gcd(a, b) = k]\)
化简得到:
\(\sum_{k = 1}^{n}(x^k - 1)((2\sum_{i = 1}^{\lfloor \frac{n}{k}\rfloor} \phi(i)) -1)\)
卢卡斯定理
如果 \(p\) 是质数,有公式
\(C^n_{m} \equiv C_{m~mod~p}^{n~mod~p}\times C^{\lfloor \frac{n}{p}\rfloor}_{\lfloor \frac{m}{p} \rfloor}(mod~p)\)
[BZOJ 1951] 古代猪文
求 \(G^{\sum_{d|n} C_n^{d}}~mod~999911659\)
因为 \(999911659\) 是个质数,由欧拉定理推论得到。
\(G^{\sum_{d|n} C_n^{d}}~mod~999911659 = G^{\sum_{d|n} C_n^{d}~mod~999911658}~mod~999911659\)
直接 \(Lucas\) 计算 \(\sum_{d|n} C_n^{d}~mod~999911658\) 会挂
将 \(999911658\) 质因数分解,\(999911658 = 2\times 3\times 4679 \times 35617\)
枚举 \(d\),然后分别计算 \(\sum d|n~ C_n^d\) 对 \(2, 3, 4679, 35617\) 四个质数取模的结果记作 \(a_1, a_2, a_3, a_4\) 。
最后用中国剩余定理求个方程组
然后快速幂求答案就好。
线性基
- 异或运算与 \(01\) 串
- 高斯消元
最值反演。。。。