前言
长文警告
这是暑假的一个课件,突然想起来,就发出来了。
全部有关的习题的题单:https://www.luogu.com.cn/training/184246
由于 BSGS 和 拉格朗日插值 是后面临时加的,所以顺序被调到了前面,而且没有习题。
以下为原文(略有改变)
目录
数论基础
\[\text{————————by jiangtaizhe001} \]首先默认讨论的数全是整数。
整除、取余、同余的定义
记 \(a=bq+r\),其中 \(q\not=0,0\le r<q\),则称 \(a\bmod q=r\)。
如果 \(r=0\) 即 \(a\bmod b=0\) 那么称 \(q\) 整除 \(a\),记作 \(q\mid a\),此时 \(q\) 为 \(a\) 的约数,\(a\) 是 \(q\) 的倍数。
如果 \(r\not=0\) 即 \(a\bmod p\not=0\),那么称 \(q\) 不整除 \(a\),记作 \(q\nmid a\)。
如果 \(a\bmod p=b\bmod p\),那么称 \(a,b\) 模 \(p\) 同余,记作 \(a\equiv b\pmod p\)
整除、同余的性质
\(a\mid b \Rightarrow \left| a \right| \le \left| b \right| \quad a\mid b\Rightarrow ka\mid kb \quad a\mid b,b\mid c \Rightarrow a\mid c\)
\(a\equiv b\pmod p \Rightarrow p\mid (a-b)\)
\(a\equiv b \pmod p \Rightarrow a+c\equiv b+c \pmod p\)
\(a\equiv b \pmod p \Rightarrow ac\equiv bc \pmod p\)
\(a\equiv b \pmod p \Rightarrow a^n\equiv b^n \pmod p\)
质数与合数
将全体正整数按照约数个数分类可以分为质数(又称素数)、合数和 \(1\)。
质数有 \(2\) 个约数,合数的约数数量 \(\ge 2\),\(1\) 只有一个约数,\(1\) 既不是质数也不是合数。
质数的数量是无限的。
证明:
假设质数数量有限,那么设有 \(n\) 个质数,分别为 \(p_1,p_2,\dots,p_n\)。
考虑 \(t=\left(\prod\limits_{i=1}^{n}p_i\right)+1\)。
如果这个数字是质数,那么显然 \(t>p_i\),假设不成立。
如果这个数字不是质数,我们发现 \(p_i\) 都不是 \(t\) 的约数,假设不成立。
所以推出原假设矛盾,故质数有无数个。
我们一般用 \(\pi(n)\) 代表小于等于 \(n\) 的质数个数。
当 \(n\) 比较大的时候我们可以认为 \(\pi(n)\sim\dfrac{x}{\ln x}\)。
筛法
一个一个判断(筛至根号):\(O\left(n\sqrt{n}\right)\)
埃拉托斯特尼筛法:\(O\left(n\log\log n\right)\)
欧拉筛(线性筛):\(O\left(n\right)\)
当然埃氏筛可以使用 bitset
进行优化,欧拉筛还可以筛大部分积性函数。
欧拉函数
定义
\(\varphi(n)\) 代表 小于等于 \(n\) 并且与 \(n\) 互质的正整数数的个数。
计算
将 \(n\) 进行质因数分解得到 \(n=\prod_{i=1}^{k} p_i^{a_i}(a_i>0)\)
根据欧拉函数定义可得
证明略。
若 \(\gcd(a,b)=1\) 则 \(\varphi(a)\times\varphi(b)=\varphi(a\times b)\)(欧拉函数是积性函数,可以用上面的结论证明)
根据以上结论可以在 \(O\left(\sqrt{n}\right)\) 时间内求出 \(\varphi(n)\),可以利用线性筛在 \(O(n)\) 的时间内求出 \(\varphi(1),\varphi(2),\dots,\varphi(n)\)。
欧拉定理与费马小定理
当 \(\gcd(a,p)=1\) 时,\(a^{\varphi(p)}\equiv1\pmod p\)
证明:
根据欧拉函数的定义,满足 \(1\le r\le p\) 并且 \(\gcd(r,p)=1\) 的数字 \(r\) 的数量为 \(\varphi(p)\) 个,记作 \(r_1,r_2,\dots,r_{\varphi(p)}\),显然 \(r_i\) 两两模 \(p\) 不同余。
不难得到对于任意的 \(i\) 有 \(\gcd(ar_i,p)=1\)。
假设存在 \(1\le i<j\le m\) 使得 \(ar_i\equiv ar_j\pmod p\) 成立,由于 \(\gcd(a,p)=1\) 所以 \(r_i\equiv r_j\pmod p\),所以假设不成立,也就是说 \(ar_i\) 两两模 \(p\) 不同余。
所以说对于任意的 \(1\le i\le m\),存在且仅存在一个 \(j\) 使得 \(r_i\equiv ar_j\pmod p,1\le j\le m\)
也就是说
由于 \(\gcd(r_i,p)=1\),所以可以将相同部分的 \(\prod\limits_{i=1}^{\varphi(p)}r_i\) 约去。
得到
当 \(p\) 为质数的时候,\(\varphi(p)=p-1\),那么就可以得到
\[a^{p-1}\equiv 1\pmod p \]这就是费马小定理。
gcd、exgcd
gcd
\[\gcd(a,b)=\gcd(b,a\bmod b) \]证明如下:
设 \(a=bq+r\) 并且 \(0\le r<b\),显然 \(r=a \bmod b\),
设 \(d\mid a\) 且 \(d\mid b\),\(d\) 就是 \(a,b\) 的公约数,
由 \(a=bq+r\) 得 \(\dfrac{a}{d}=q\times\dfrac{b}{d}+\dfrac{r}{d}\),
也就是 \(\dfrac{r}{d}=\dfrac{a}{d}-q\times\dfrac{b}{d}\)
因为 \(d\mid a,d\mid b\),所以 \(\dfrac{a}{d},q\times \dfrac{b}{d}\) 都是整数,
所以 \(\dfrac{r}{d}\) 也是整数,\(d\) 也是 \(b,a \bmod b\) 的公约数,
同理我们也可以设 \(e\mid b\) 且 \(e\mid a \bmod b\),
同理可以证明 \(e\) 也是 \(a,b\) 的公约数。
换句话说, \(a,b\) 的公约数都是 \(b,a \bmod b\) 的公约数,\(b,a \bmod b\) 的公约数也都是 \(a,b\) 的公约数,
也就是说 \(a,b\) 和 \(b,a \bmod b\) 的公约数都相同,那么它们的最大公约数也都相等,也就是 \(\gcd(a,b)=\gcd(b,a\bmod b)\)
根据这个结论我们可以递归在 \(O(\log n)\) 的时间内求出两个数字的最大公约数,当两个数字为斐波那切数列的相邻两项的时候为最坏情况。这个算法被称为欧几里得辗转相除法。
裴蜀定理
裴蜀定理(又称贝祖定理):
如果\(\gcd(a,b)\mid c\),那么关于 \(x,y\) 的一元二次方程 \(ax+by=c\) 有解。
可以根据 exgcd 辗转相除然后回带的过程来证明,这里就略去证明。
exgcd
找到关于 \(x,y\) 的一元二次方程 \(ax+by=\gcd(a,b)\) 的一组解
根据 gcd 的过程,将原方程转化为
因为 \(\gcd(a,b)=\gcd(b,a\bmod b)\),所以联立上面两式可得
\[ax+by=bx'+(a\bmod b)y' \]根据 \(a\bmod b=a-\left\lfloor\dfrac{a}{b}\right\rfloor\times b\) 带入化简可得
\[\left(x-y'\right)a+\left(y-x'+\left\lfloor\dfrac{a}{b}\right\rfloor\times y'\right)b=0 \]此时我们可以得到
\[\left\{ \begin{aligned} x & = y'\\ y & = x'-\left\lfloor\dfrac{a}{b}\right\rfloor\times y' \end{aligned} \right. \]这样可以递归求解,递归边界就是 \(b=0\),返回 \((x,y)=(1,0)\) 即可。
当我们有一组解 \(x=x',y=y'\) 的时候,就可以得出通解:
\[\left\{ \begin{aligned} x &= x'+\dfrac{kb}{\gcd(a,b)}\\ y &= y'-\dfrac{ka}{\gcd(a,b)} \end{aligned} \right. \]其中 \(k\) 为任意整数。
更一般的,对于任意的一个关于 \(x,y\) 的二元一次方程 \(ax+by=c\)
如果 \(\gcd(a,b)\mid c\) 那么我们先解出方程 \(ax+by=\gcd(a,b)\) 的一组特解 \(x',y'\),设 \(m=\dfrac{c}{\gcd(a,b)}\),不难得出通解:
应用:解线性同余方程
考虑关于 \(x\) 的以下方程:
\[ax\equiv b\pmod p \]根据同余的定义可得
存在一个正整数 \(k\) 满足
也就是
\[ax-pk=b \]这就是一个关于 \(x,k\) 的一个一元二次方程了,直接使用 exgcd 即可。
乘法逆元
定义
对于整数 \(x\),如果 \(\gcd(a,p)=1\),那么不难证明存在一个 \(0\le a<p\) 使得 \(ax\equiv 1\pmod p\),那么称 \(a\) 在模 \(p\) 下的逆元为 \(x\),记作 \(\dfrac{1}{a}\) 或 \(a^{-1}\)。
计算
方法一:快速幂
当 \(p\) 为质数的时候,可得
所以
\[a^{-1}\equiv a^{p-2}\pmod p \]方法二:exgcd
其实就是解这个线性同余方程即可。
方法三:线性逆元线性求
考虑在 \(O(n)\) 的时间内求出 \(1,2,\dots,n\) 所有数字模 \(p\) 的逆元。(下面的逆元默认为模 \(p\) 意义下)
显然 \(1\) 的逆元为 \(1\),然后假设我们已经求出 \(1,2,3,\dots,a-1\) 的逆元,现在求 \(a\) 的逆元。
设 \(p=aq+r\) 其中 \(0\le r<a\),显然 \(q=\left\lfloor\dfrac{p}{a}\right\rfloor,r=p\bmod a\)
显然
移项得
\[aq\equiv -r\pmod p \]两边同时乘上 \(a^{-1}r^{-1}\),得
\[a^{-1}\equiv q\times r^{-1}\pmod p \]也就是
\[a^{-1}\equiv -\left\lfloor\dfrac{p}{a}\right\rfloor\times (p\bmod a)\pmod p \]这样就可以 \(O(n)\) 求了。
方法四:阶乘逆元线性求
在做组合题的时候,根据公式 \(C_n^m=\dfrac{n!}{m!\times(n-m)!}\),我们发现只需要预处理出 \(n!\) 和 \(n!^{-1}\) 就可以 \(O(1)\) 求组合数在模一个大质数的结果了。
其实不难发现
所以只需要反着刷一遍就好,时间复杂度是 \(O(n)\)。
中国剩余定理
中国剩余定理 (Chinese Remainder Theorem) 简称CRT。
CRT
考虑解以下关于 \(x\) 的方程:
\[\left\{ \begin{aligned} x & \equiv a_1\pmod {m_1}\\ x & \equiv a_2\pmod {m_2}\\ x & \equiv a_3\pmod {m_3}\\ \vdots & \\ x & \equiv a_n\pmod {m_n}\\ \end{aligned} \right. \]保证 \(m_i\) 两两互质。
我们考虑如何解这个方程。
我们考虑对于每个 \(i\) 找到一个 \(c_i\),使得
这样显然解就是
\[x\equiv \sum_{i=1}^{n}a_ic_i \pmod{\prod_{i=1}^n m_i} \]考虑如何得到 \(c_i\),显然 \(c_i\) 一定是 \(M_i=\prod\limits_{j=1,j\not=i}^{n}m_j\) 的倍数。
这样就已经满足 \((2)\) 式了,接下来考虑如何满足 \((1)\) 式。
注意到求出 \(M_i\) 在模 \(m_i\) 意义下的逆元 \(M_i^{-1}\),令 \(c_i=M_i\times M_i^{-1}\) 就可以了。由于满足 \(m_i\) 两两互质,所以逆元肯定存在。
总结中国剩余定理的步骤:
- 计算 \(M=\prod\limits^{n}_{i=1}m_i\)
- 对于所有的 \(1\le i \le n\) 计算 \(M_i=\dfrac{M}{m_i}\)
- 令 \(M_i^{-1}\) 为 \(M_i\) 在模 \(m_i\) 意义下的逆元
- 方程的解为
证明略。
exCRT
更一般的,如果不保证 \(m_i\) 两两互质,是否能够以上方法得到通解呢?
这是我们发现这个 \(c_i\) 不一定能够找到,因为 \(M_i\) 在模 \(m_i\) 意义下的逆元不一定存在。
所以我们需要寻找另外的解法。
我们简化一下问题,我们可以先考虑两个方程的情况,然后两两合并方程即可。
\[\left\{ \begin{aligned} x \equiv a_1 \pmod {m_1} \\ x \equiv a_2 \pmod {m_2} \\ \end{aligned} \right. \]根据前面的做法,我们可以把同余方程转化为一元二次不定方程,得到
\[\left\{ \begin{aligned} x =m_1q+a_1\\ x=m_2p+a_2 \\ \end{aligned} \right. \]两式相减可得
\[m_1q-m_2p=a_2-a_1 \]利用 exgcd 解出这个关于 \(p,q\) 的方程,如果无解就说明原方程无解。
这样就可以解出方程,解为
或者是
\[x\equiv a_2p+b_2\pmod {\operatorname{lcm}(m_1,m_2)} \]这样复杂度也是 \(O(n\log m_i)\) 的,但是稍微会难写一点。
整除分块
整除分块又叫数论分块。
引-UVA11526 H(n)
求出
\[\sum_{i=1}^{n}\left\lfloor\dfrac{n}{i}\right\rfloor \]多组数据,\(0\le n\le 2^{31}-1\),数据组数 \(T\le 1000\)。
显然直接枚举是不行的。我们可以令 \(f(x)=\left\lfloor\dfrac{n}{i}\right\rfloor\),先令 \(n=10\),作出函数 \(y=f(x)\) 的图像。
我们发现,虽然自变量 \(x\) 的取值有 \(10\) 种,但是 \(f(x)\) 的取值只有 \(5\) 种。并且当 \(n=100\) 的时候,\(x\) 的取值又 \(100\) 种,但是 \(f(x)\) 的取值只有 \(19\) 种。
不难发现以下结论:
\[\forall n\in\N_+, \left| \{ \left\lfloor\dfrac{n}{i}\right\rfloor \mid i\in\N_+,i\le n \} \right| \le 2 \lfloor\sqrt{n}\rfloor \]证明:
当 \(i\le \lfloor\sqrt{n}\rfloor\) 时,\(\left\lfloor\dfrac{n}{i}\right\rfloor\) 最多 \(\lfloor\sqrt{n}\rfloor\) 个数字。
当 \(\lfloor\sqrt{n}\rfloor<i\le n\) 时,\(1\le\left\lfloor\dfrac{n}{i}\right\rfloor\le\lfloor\sqrt{n}\rfloor\),最多有 \(\lfloor\sqrt{n}\rfloor\) 个数字。
因此最多只有 \(2\lfloor\sqrt{n}\rfloor\) 个数字。
所以说,我们可以能够预处理出每个使 \(f(x)\) 相同的区间来更快地计算答案,这样的时间复杂度是 \(O(\sqrt{n})\) 的,提高了不少。
结论
对于一个数字 \(n\),如果 \(\left\lfloor\dfrac{n}{i}\right\rfloor=\left\lfloor\dfrac{n}{j}\right\rfloor\) 成立,那么满足 \(i<j\le n\) 最大的 \(j\) 为 \(\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{i}\right\rfloor}\right\rfloor\)
结论证明
引理
引理:
\[\forall a,b,c\in \Z,abc\not=0, \left\lfloor\dfrac{a}{bc}\right\rfloor =\left\lfloor\dfrac{\left\lfloor\frac{a}{b}\right\rfloor}{c}\right\rfloor \]证明:
设
那么
\[\left\lfloor\dfrac{a}{bc}\right\rfloor =\left\lfloor\left(\left\lfloor\frac{a}{b}\right\rfloor+r\right)\times\dfrac{1}{c}\right\rfloor =\left\lfloor\dfrac{\left\lfloor\frac{a}{b}\right\rfloor}{c}+\dfrac{r}{c}\right\rfloor =\left\lfloor\dfrac{\left\lfloor\frac{a}{b}\right\rfloor}{c}\right\rfloor\]结论证明
首先显然有
\[\left\lfloor\frac{n}{i}\right\rfloor\le \frac{n}{i} \]所以
\[\left\lfloor \dfrac{n}{ \left\lfloor\dfrac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor }\right\rfloor\ge \left\lfloor \dfrac{n}{ \left\lfloor\dfrac{n}{\frac{n}{i} }\right\rfloor }\right\rfloor\ge \left\lfloor \frac{n}{\left\lfloor i\right\rfloor} \right\rfloor= \left\lfloor \frac{n}{i} \right\rfloor \]所以说最大的 \(j\) 满足 \(\left\lfloor\dfrac{n}{i}\right\rfloor=\left\lfloor\dfrac{n}{j}\right\rfloor\) 为 \(\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{i}\right\rfloor}\right\rfloor\) 。
实例
假设我们需要计算式子大概为类似 \(\sum\limits_{i=1}^{n}f(i)\left\lfloor\dfrac{n}{i}\right\rfloor\) 的形式并且可以得到 \(f(i)\) 的前缀和 \(s(i)\),那么我们可以在 \(O(\sqrt{n})\) 的时间内求出这个式子。(假设 \(s(i)\) 调用复杂度为 \(O(1)\))
代码大致如下:
int l=1,r,sum=0;
while(l<=n){
r=n/(n/l);
sum+=n/l*(s(r)-s(l-1));
l=r+1;
}
多维数论分块
有些时候式子可能会更加复杂,大概是类似于 \(\sum\limits_{i=1}^{n}f(i)\prod\limits_{j=1}^{m}\left\lfloor\dfrac{a_j}{i}\right\rfloor\),此时 \(i\) 所在的右端点就会变成 \(\min\limits_{j=1}^{m}\left\lfloor\dfrac{n_j}{\left\lfloor\dfrac{n_j}{i}\right\rfloor}\right\rfloor\)。当然其实 \(n=2\) 的情况最常见。
应用
数论分块更多结合莫比乌斯反演来降低时间复杂度。
卢卡斯定理
卢卡斯定理用于求出当模数为一个比较小的质数的时候 \(\dbinom{n}{m}\) 的值。
这里就给个公式吧,其实是因为我大不会证明。
其中 \(p\) 为质数。
这时我们只需要预处理出 \(1!,2!,\dots,(p-1)!\) 这些数字模 \(p\) 的值以及模 \(p\) 意义下的逆元就可以通过递归求出任意的 \(\dbinom{n}{m}\) 了。空间复杂度 \(O(p)\),时间复杂度为 \(O(p+\log_pn)\)。
当 \(p\) 不为质数的时候就需要用扩展卢卡斯定理来求了,这里不写出。
BSGS
基础篇
找到方程
\[a^x\equiv b \pmod p \]的最小整数解,其中 \(\gcd(a,p)=1\),\(1\le a,p\le 10^{12}\)。
首先根据欧拉定理,我们知道
\[a^{x}\equiv a^{x\bmod \varphi(p)}\pmod p \]由于 \(\varphi(p)<p\),所以如果方程有解,那么在 \([0,p]\) 内肯定会有解。
直接枚举显然是不行的,我们发现因为 \(\gcd(a,p)=1\),所以 \(a\) 的任意次方在模 \(p\) 意义下都存在逆元,我们是否能够使用这一个性质来解这个方程呢?
令 \(x=A\left\lceil\sqrt{p}\right\rceil+B\)
这样就有
这样不难得到
\[a^{A\lceil\sqrt{p}\rceil}\equiv a^{-B}b \pmod p \]我们可以对于所有的 \(0\le B\le \lceil\sqrt{p}\rceil\) 求出 \(a^{-B}b\) 在模 \(p\) 下的值,放到一个哈希表里面,然后枚举 \(A\) 检验就可以了。
时间复杂度 \(O(\sqrt{p})\)
扩展篇
如果 \(\gcd(a,p)\not=1\),我们应该怎么办呢?
我们发现这时我们对于所有的 \(0\le B\le \lceil\sqrt{p}\rceil\),我们不一定可以找到 \(a^{B}\) 在模 \(p\) 意义下的逆元,所以我们试图通过一些方法来转化。
众所周知,\(ac\equiv bc\pmod {pc}\Rightarrow a\equiv b\pmod p\)
我们可以利用这个性质来转化原式。
令 \(t_1=\gcd(a,p)\)
这样我们就得到
继续令 \(t_2=\gcd(a,\dfrac{p}{t_1})\),得到
\[\dfrac{a^2}{t_1t_2}\times a^{x-2}\equiv \dfrac{b}{t_1t_2}\pmod {\dfrac{p}{t_1t_2}} \]接下来令 \(t_3=\gcd(a,\dfrac{p}{t_1t_2})\),得到
\[\dfrac{a^3}{t_1t_2t_3}\times a^{x-3}\equiv \dfrac{b}{t_1t_2t_3}\pmod {\dfrac{p}{t_1t_2t_3}} \]我们可以继续进行这样的操作若干次,直到 \(\gcd(a,\dfrac{p}{\prod_{i=1}^{n}t_i})=1\),得到
\[\dfrac{a^n}{\prod_{i=1}^{n}t_i}\times a^{x-n}\equiv \dfrac{b}{\prod_{i=1}^{n}t_i}\pmod {\dfrac{p}{\prod_{i=1}^{n}t_i}} \]这样就可以转化为 BSGS 求解了。
不过要注意两个细节:
- 解可能小于 \(n\),所以需要是否存在小于 \(n\) 的解。
- 如果 \(\prod_{i=1}^{n}t_i\nmid b\) 那么无解。
显然 \(n\) 是 \(O(\log p)\) 级别,所以时间复杂度还是 \(O(\sqrt p)\)
拉格朗日插值
给定一个 \(n-1\) 次函数 \(f(x)\) ,已知
\[\left\{ \begin{aligned} f(x_1) & = y_1 \\ f(x_2) & = y_2 \\ & \vdots \\ f(x_n) & = y_n \\ \end{aligned} \right. \]现在求出 \(f(k)\),\(k\) 为任意值。
显然我们可以通过差分、高斯消元来求出 \(f(x)\) 的表达式,进一步求出 \(f(k)\),但是这样的复杂度都是 \(O(n^3)\) 的,能否找到更优的解法呢?
我们可以试试能不能 直接构造 出 \(f(x)\) 的表达式。
考虑先构造 \(n\) 个函数 \(f_1(x),f_2(x),\dots,f_n(x)\) ,使得
\[\left\{ \begin{aligned} f_i(x_i) &= y_i & \\ f_i(x_j) &= 0 & (i\not=j) \end{aligned} \right. \]显然这样就能得到 \(f(x)=\sum_{i=1}^{n}f_i(x)\)。
考虑如何构造 \(f_i(x)\)
显然 \(f_i(x)\) 存在因子
这样就可以设
\[f_i(x)=a\prod_{j=1,j\not=i}^{n}(x-x_j) \]带入点 \((x_i,y_i)\) 就可以得到
\[f_i(x)=y_i\prod_{j=1,j\not=i}^{n}\dfrac{x-x_j}{x_i-x_j} \]所以
\[f(x)=\sum_{i=1}^{n}y_i\prod_{j=1,j\not=i}^{n}\dfrac{x-x_j}{x_i-x_j} \]这样虽然求 \(f(x)\) 表达式仍然是 \(O(n^3)\),但是如果直接单点求值的话就是 \(O(n^2)\) 的了。
习题选讲
P7960 [NOIP2021] 报数
两个人玩报数游戏,如果一个数字存在一个约数在十进制下有数字 \(7\),那么这个数字不能被报出。上一个人报出的数字为 \(x\),现在求下一个报出的数字为多少,如果上一个人报出的数字不合法输出 \(-1\)。
多组数据,数据组数 \(T\le 2\times10^5,1\le x\le10^7\)。
Solution
\(x\le 10^7\),所以其实不需要使用线性筛,根据前面游戏的规则发现埃氏筛更加使用,所以直接用埃氏筛筛出所有能被报出的数字即可,注意不要筛到 \(10^7\) 就停。时间复杂度 \(O(n\log\log n+T)\)。(其实会小一点)
P2158 [SDOI2008] 仪仗队
有一个 \(N\times N\) 的方阵,现在你在方阵的左下角。如果方阵排整齐,求你能看到几个同学。\(N\le 4\times10^4\)。
Solution
我会莫比乌斯反演!
不难发现答案就是 \(\sum_{i=0}\limits^{N-1}\sum\limits_{j=0}^{N-1}[\gcd(i,j)=1]\)。
考虑以下内容帮助我们解题:
\(\gcd\) 的两个性质:\(\gcd(a,b)=\gcd(b,a)\)、\(\gcd(0,i)=\gcd(i,0)=i\)
欧拉函数的定义:\(\varphi(n)=\sum\limits_{i=1}^{n}[\gcd(i,n)=1]\)
不难得到:
跑个线性筛就可以了。时间复杂度 \(O(N)\)
P2398 GCD SUM
求
\[\sum\limits_{i=1}^n \sum\limits_{j=1}^n \gcd(i,j) \]其中 \(n\le 10^5\)
Solution
我会莫比乌斯反演!
所以只需要跑个线性筛,然后预处理出 \(\varphi(n)\) 的前缀和就可以了。时间复杂度 \(O(n)\)。
P4774 [NOI2018] 屠龙勇士:
按照编号 \(1 \rightarrow n\) 顺序杀掉 \(n\) 条巨龙,每条巨龙拥有一个初始的生命值 \(a_i\) 。并且巨龙会在生命值为负的时候恢复生命值 \(p_i\) ,当生命值 恰好 为 \(0\) 时它才会死去。
最初你拥有 \(m\) 把攻击力已知的剑,每次可以选择一把剑来面对巨龙,当杀死巨龙后这把剑就会消失,同事玩家会获得全新的一把剑。
每次面对巨龙时,默认会选择当前拥有的,攻击力不高于巨龙初始生命值中攻击力最大的一把剑作为武器。如果没有这样的剑,则选择攻击力最低 的一把剑作为武器,设攻击力为 \(ATK\)。
每次面对每条巨龙,它都会使用上一步中选择的剑攻击巨龙固定的 \(x\) 次,使巨龙的生命值减少 \(x \times ATK\) 。
之后,巨龙会不断恢复 \(p_i\) 的生命值。若在使用恢复能力前或某一次恢复后其生命值为 \(0\) ,则巨龙死亡,开始杀掉下一条巨龙。
现在需要求出题目中 \(x\) 的最小值,若最小值不存在输出 \(-1\)。
数据范围: \(n\le 10^5\),\(a_i\le10^{12}\),\(\operatorname{lcm}(p_i)\le 10^{12}\),所有武器的攻击力 \(\le 10^6\)。
Solution
首先使用平衡树(或者是 multiset
)求出打每一只巨龙所用的剑的伤害,显然打每一只巨龙所用的剑的伤害是一个固定的值。设打第 \(i\) 只巨龙所用的剑的伤害为 \(atk_i\)。
然后就相当于解下面的同余方程组:
方法一
显然每一个方程都是线性同余方程,所以可以解出这 \(n\) 个方程,就可以直接使用 exCRT 进行求解。
方法二
还是考虑两两合并方程,然后转化为一元二次不定方程求解。
P2480 [SDOI2010]古代猪文
求出
\[g^{\sum_{d\mid n}C_n^k}\bmod999911659 \]其中 \(n,g\le 10^9\)。
Solution
首先发现 \(999911659\) 为一个质数,所以根据欧拉定理或费马小定理可以得到所求式子就是
此时重点就在于求出
\[\sum_{d\mid n}C_n^k\bmod 9999611658 \]枚举 \(k \mid n\) 显然是 \(O(\sqrt{n})\) 的时间复杂度,但是我们发现 \(9999611658\) 不是质数,所以通过求出阶乘及阶乘逆元在模 \(999611658\) 的值来求组合数是不可行的,因为逆元不一定存在。
但是我们考虑到 \(9999611658=2\times3\times4679\times35617\),每一个质因数的次数都为 \(1\),所以我们可以利用卢卡斯定理求出这个式子在模 \(2,3,4679,35617\) 下的值,然后使用 CRT 合并答案即可。
这也是 CRT 非常重要的一个用途之一。
P2261 [CQOI2007]余数求和
求出
\[\sum_{i = 1}^n k \bmod i \]其中 \(1\le n,k\le 10^9\)。
\[\begin{aligned} & \sum_{i = 1}^n k \bmod i\\ = & \sum_{i=1}^{n}\left(k-\left\lfloor\dfrac{k}{i}\right\rfloor\times i\right)\\ = & n\times k-\sum_{i=1}^{n}\left(\left\lfloor\dfrac{k}{i}\right\rfloor\times i\right) \end{aligned} \]直接整除分块就可以了。
注意在代码中 k/(k/i)
当 \(i>k\) 的时候会因为除数为 \(0\) RE 掉,需要特判。
CF 数论题目选讲
CF1458A
题目大意:
给定一个长度为 \(n\) 的数组 \(a\) 和一个长度为 \(m\) 的数组 \(b\)。
现在对于每一个 \(1\le j\le m\),求出 \(\gcd(a_1+b_j,a_2+b_j,\dots,a_n+b_j)\)。
\(1\le n,m\le 10^5\),\(1\le a_i,b_i\le 10^{18}\)
Solution
首先 \(n=1\) 的时候特判掉。
根据辗转相除可以知道 \(\gcd(a,b)=\gcd(a,b-a)\)。
所以我们可以利用这个东西把 \(b_j\) 这一个变动的项消去,只剩下一个。
原式转化为 \(\gcd(a_2-a_1,a_3-a_2,\dots,a_n-a_{n-1},a_n+b_j)\),直接预处理出除掉最后一项的 \(\gcd\) 即可。
时间复杂度 \(O(n\log a_i+m\log b_i)\)
CF1513D
题目大意:
给定一个长度为 \(n\) 的序列 \(a\) 和一个数字 \(p\)。
如果 \(\gcd(a_i,a_{i+1},\dots,a_j)=\min(a_i,a_{i+1},\dots,a_j)\),那么就在 \(i,j\) 之间连接一条边权为 \(\min(a_i,a_{i+1},\dots,a_j)\) 的边。同时 \(i,i+1\) 两个点之间会有一条边权为 \(p\) 的边。
\(2\le n\le 2\times 10^5\),\(1\le a_i,p\le 10^9\)
Solution
显然我们发现:如果序列 \(a_i,a_{i+1},\dots,a_j\) 中最小值为 \(k\),并且所有数字都是 \(k\) 的倍数,那么这些点都是联通的,边权为 \(k\)。
所以只需要判断一下满足 \(\gcd(a_i,a_{i+1},\dots,a_j)=\min(a_i,a_{i+1},\dots,a_j)\) 的所有极大区间 \([i,j]\) 即可。
具体做法是找到所有比 \(p\) 小的 \(a_i\),然后向两边扩展到极大,把这一段覆盖掉,如果遇到已经被覆盖的就不需要覆盖了。注意如果一个点从左边被覆盖了,还能从右边覆盖一次。
时间复杂度 \(O(n\log n)\)
CF1665D
交互题,你需要猜出一个数字 \(x\)。
每次你可以给出 \(a,b\),然后你会得到 \(\gcd(x+a,x+b)\) 的值,你最多可以进行这样的操作 \(30\) 次。
\(1\le x\le 10^9\),\(1\le a,b\le 2\times 10^9\)
Solution
显然 \(\gcd(x+a,x+b)=\gcd(x+a,b-a)\)。
这样我们就可以猜出 \(x\) 在二进制下的每一位。
我们从低位到高位猜,假设现在猜的是从右往左第 \(i\) 位,那么我们现在就已经知道了右边 \(i-1\) 位,这些位的数值的和记作 \(y\),令 \(a=2^{i-1}-y\),\(b=2^{i}+2^{i-1}-y\)。假设返回的数是 \(m\)。 如果 \(m=2^i\),也就是说,在第 \(i\) 位加上了 \(1\) 会产生进位,那么这一位就是 \(1\),反之这一位就是 \(0\)。
这样刚好需要猜 \(30\) 次。
但是有没有更加优秀的做法呢?
由于 \(\gcd(x+a,x+b)=\gcd(x+a,b-a)\),所以 \((b-a)\mid\gcd(x+a,x+b)\iff(b-a)\mid(x+a)\)
考虑构造一个序列 \(t\),使序列 \(t\) 中的数字两两互质,并且这些数字尽可能小,令 \(a=\prod t\) 有 \(10^9\le a\le 2\times 10^9\)。
令 \(m=t_{\max}\),枚举 \(i\) 从 \(1\) 到 \(m\),询问得到 \(\gcd(x+a+i,x+i)=\gcd(x+i,a)\) 的值。
如果 \(t_i\mid \gcd(x+i,a)\),那么 \(t_i\mid x+a+i\),我们就能得到 \(x\equiv -i \pmod {t_i}\)。然后直接使用中国剩余定理合并答案,由于 \(x\le 10^9\le a\le 2\times 10^9\),所以答案只有一种可能。
当 \(t=\{4,5,7,9,11,13,17,19,23\}\),此时满足条件。
这样只需要询问 \(23\) 次。
但是我们发现,枚举 \(i\) 从 \(1\) 到 \(23\) 的时候肯定都会得到 \(x\) 对于 \(t\) 中任意一个元素取模的答案,所以如果在前 \(22\) 次的猜测中都没有得到答案,那么肯定在 \(i=23\) 的时候能得到答案。
所以这样只需要询问 \(22\) 次。