首页 > 其他分享 >数论基础

数论基础

时间:2022-10-19 13:47:45浏览次数:80  
标签:lfloor right gcd 数论 dfrac 基础 le left

前言

长文警告
这是暑假的一个课件,突然想起来,就发出来了。
全部有关的习题的题单: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)\)
根据欧拉函数定义可得

\[\varphi(n)=n\times\prod_{i=1}^{k}\left(1-\dfrac{1}{p_i}\right) \]

证明略。

若 \(\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\)
也就是说

\[\prod_{i=1}^{\varphi(m)}r_i\equiv \prod_{i=1}^{\varphi(m)}ar_i\pmod p \]

由于 \(\gcd(r_i,p)=1\),所以可以将相同部分的 \(\prod\limits_{i=1}^{\varphi(p)}r_i\) 约去。
得到

\[a^{\varphi(p)}\equiv 1\pmod p \]

当 \(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 的过程,将原方程转化为

\[bx'+(a\bmod b)y'=\gcd(b,a\bmod b) \]

因为 \(\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)}\),不难得出通解:

\[\left\{ \begin{aligned} x &= m\times x'+\dfrac{kb}{\gcd(a,b)}\\ y &= m\times y'-\dfrac{ka}{\gcd(a,b)} \end{aligned} \right. \]

应用:解线性同余方程

考虑关于 \(x\) 的以下方程:

\[ax\equiv b\pmod p \]

根据同余的定义可得
存在一个正整数 \(k\) 满足

\[ax=kp+b \]

也就是

\[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^{p-1}\equiv 1\pmod 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+r\equiv 0\pmod p \]

移项得

\[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)\) 求组合数在模一个大质数的结果了。
其实不难发现

\[(n+1)!^{-1}\times(n+1)\equiv n!^{-1} \pmod p \]

所以只需要反着刷一遍就好,时间复杂度是 \(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\),使得

\[\begin{aligned} c_i & \equiv & 1 & \pmod{m_i} & & (1)\\ c_i & \equiv & 0 & \pmod{m_j} &\quad (i\not=j) \quad & (2) \end{aligned} \]

这样显然解就是

\[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\) 两两互质,所以逆元肯定存在。

总结中国剩余定理的步骤:

  1. 计算 \(M=\prod\limits^{n}_{i=1}m_i\)
  2. 对于所有的 \(1\le i \le n\) 计算 \(M_i=\dfrac{M}{m_i}\)
  3. 令 \(M_i^{-1}\) 为 \(M_i\) 在模 \(m_i\) 意义下的逆元
  4. 方程的解为

\[x\equiv \sum_{i=1}^{n}a_iM_iM_i^{-1}\pmod M \]

证明略。

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_1q+b_1\pmod {\operatorname{lcm}(m_1,m_2)} \]

或者是

\[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)\) 的图像。
graph1.png

我们发现,虽然自变量 \(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 \]

证明:

\[\dfrac{a}{b}=\left\lfloor\dfrac{a}{b}\right\rfloor+r,0\le r<1 \]

那么

\[\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}\) 的值。
这里就给个公式吧,其实是因为我大不会证明。

\[\binom{n}{m}\equiv\binom{\left\lfloor n/p \right\rfloor}{\left\lfloor m/p \right\rfloor}\times\binom{n\bmod p}{m\bmod p} \pmod p \]

其中 \(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+B}\equiv b\pmod p \]

这样不难得到

\[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)\)
这样我们就得到

\[\dfrac{a}{t_1}\times a^{x-1}\equiv \dfrac{b}{t_1}\pmod {\dfrac{p}{t_1}} \]

继续令 \(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 求解了。

不过要注意两个细节:

  1. 解可能小于 \(n\),所以需要是否存在小于 \(n\) 的解。
  2. 如果 \(\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)\) 存在因子

\[\prod_{j=1,j\not=i}^{n}(x-x_j) \]

这样就可以设

\[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]\)
不难得到:

\[\begin{aligned} & \sum_{i=0}^{N-1}\sum_{j=0}^{N-1}[\gcd(i,j)=1]\\ = & \sum_{i=0}^{N-1}\sum_{j=0}^{i-1}[\gcd(i,j)=1] + \sum_{i=0}^{N-1}\sum_{j=i+1}^{N-1}[\gcd(i,j)=1] + \sum_{i=0}^{N-1}[\gcd(i,i)=1]\\ = & 2\times\sum_{i=0}^{N-1}\sum_{j=0}^{i-1}[\gcd(i,j)=1]+1\\ = & 2\times\sum_{i=1}^{N-1}\varphi(i)+1 \end{aligned} \]

跑个线性筛就可以了。时间复杂度 \(O(N)\)

P2398 GCD SUM

\[\sum\limits_{i=1}^n \sum\limits_{j=1}^n \gcd(i,j) \]

其中 \(n\le 10^5\)

Solution
我会莫比乌斯反演!

\[\begin{aligned} & \sum_{i=1}^n \sum_{j=1}^n \gcd(i,j)\\ = & \sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[\gcd(i,j)=d]\times d\\ = & \sum_{d=1}^{n}\sum_{i=1}^{\lfloor n/d\rfloor}\sum_{j=1}^{\lfloor n/d\rfloor}[\gcd(i,j)=1]\times d\\ = & \sum_{d=1}^{n} \left(2d\times \sum_{i=1}^{\lfloor n/d\rfloor} \left(\varphi(i)-1\right)\right) \text{(这步推导详见上一题)} \end{aligned} \]

所以只需要跑个线性筛,然后预处理出 \(\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\)。
然后就相当于解下面的同余方程组:

\[\left\{ \begin{aligned} atk_1x & \equiv a_1\pmod {p_1} \\ atk_2x & \equiv a_2\pmod {p_2} \\ \vdots & \\ atk_nx & \equiv a_n\pmod {p_n} \\ \end{aligned} \right. \]

方法一
显然每一个方程都是线性同余方程,所以可以解出这 \(n\) 个方程,就可以直接使用 exCRT 进行求解。
方法二
还是考虑两两合并方程,然后转化为一元二次不定方程求解。

P2480 [SDOI2010]古代猪文

求出

\[g^{\sum_{d\mid n}C_n^k}\bmod999911659 \]

其中 \(n,g\le 10^9\)。

Solution
首先发现 \(999911659\) 为一个质数,所以根据欧拉定理或费马小定理可以得到所求式子就是

\[g^{\sum_{d\mid n}C_n^k\bmod 9999611658}\bmod999911659 \]

此时重点就在于求出

\[\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\) 次。

标签:lfloor,right,gcd,数论,dfrac,基础,le,left
From: https://www.cnblogs.com/jiangtaizhe001/p/basic-number-theory.html

相关文章

  • 数论基础
    前言长文警告这是暑假的一个课件,突然想起来,就发出来了。全部有关的习题的题单:https://www.luogu.com.cn/training/184246由于BSGS和拉格朗日插值是后面临时加的,所......
  • Gin路由基础
    路由的基本使用gin框架中采用的路由库是基于httprouter做的地址为:https://github.com/julienschmidt/httprouter基本路由packagemainimport( "github.c......
  • plopjs 的基础使用方法
    constfs=require('fs');constpath=require('path');constactionsall=fs.readFileSync(path.resolve(__dirname,'./commitApps.txt'),'utf-8');constnameDi......
  • 『现学现忘』Git基础 — 36、标签tag(一)
    目录1、标签介绍2、列出标签3、创建标签(1)标签的分类(2)附注标签(3)轻量标签4、后期打标签1、标签介绍软件的某个发行版本所对应的,其实就是软件开发过程中,某一个阶段的最后一......
  • vi命令基础
    一、vi的基本概念基本上vi可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)命令行模式commandmode)......
  • 基础篇——JSX
    一、JSX用于描述UI的JavaScript扩展语法,是UI描述和UI数据之间的桥梁。1,语法JSX本质上还是JavaScript。①基本语法和XML语法相同,都是使用成对的标签构成一个树状结构的......
  • 基础篇——组件
    二,组件1,组件有两种定义方式:class(类组件)和使用函数(函数组件)class:继承自React.Component内部必须定义render方法,返回该组件UI的React元素使用函数:接收props作为......
  • 基础组件(一)
    1.TextInput允许用户输入文本的基础组件.属性onChangeText 接受一个函数,而此函数会在文本变化时被调用。onSubmitEditing 在文本被提交后(用户按下软键盘上的提交键)调用 ......
  • 【高等数学基础进阶】微分中值定理及导数应用
    一、微分中值定理定理1(费马引理):如果函数$f(x)$在$x_{0}$处可导,且在$x_{0}$处取得极值,那么$f'(x_{0})=0$ 定理2(罗尔定理):若$f(x)$在$[a,b]$上连续$f(x)$在$(a,b)$......
  • 数据结构基础—串
    数据结构基础—串一、串类型定义1.串的定义和相关概念字符串一般简称为串,其实就是由零个或多个字符组成的有限序列。逻辑结构和线性表极为相似,只是串的数据类型为字符型......