关于一些初等数论的证明

据说开头骗赞可以骗赞,那就骗赞吧。

目前未完成项目:

  1. 二次剩余

  2. BSGS

感觉这个东西根本更不完啊。

欢迎评论新内容。

差不多完工了。

排版有些糟糕,自己凑合着看吧(

先拿出一句巨佬 5k 说的话:

一些基本符号:

  1. \(\lfloor x\rfloor\) 指小于等于 \(x\) 的最大整数。

  2. \(\bmod\) 表示取模运算,\(a\bmod b=a-b\lfloor\dfrac{a}{b}\rfloor\)

  3. \(\equiv\),即同余。定义:当 \(a\bmod c=b\bmod c\) 时,我们称 \(a\equiv b\pmod c\)

  4. \(\in\),即包含符号。当数 \(x\) 属于集合 \(S\) 时,记做 \(x\in S\)

  5. \(\subseteq\),即集合的包含符号,\(\forall x\in S_1,x\in S_2\),则 \(S_1\subseteq S_2\)

  6. \(\sum\) 是求和符号,\(\prod\) 是乘积符号。

质数:

威尔逊定理:\(p\) 为质数的充要条件为 \((p-1)!\equiv -1\pmod p\)

证明:

\(1.\) 充分性:

反证,假设 \(p\) 是合数。

如果 \(p\) 为质数的平方,例如 \(p=4\),则 \(3!\equiv 2\pmod 4\),不成立。

\(p=k^2\),因为 \(p>4\),所以 \(k>2,2k<p,(p-1)!\equiv 0\pmod p\)

否则存在 \(p=ab,a\not = b\),则 \((p-1)!\equiv nab\equiv 0\pmod p,n\in \mathbb{N}^+\)

\(2.\) 必要性:

\(p\) 是素数,令集合 \(A=\{1,2,3,\cdots.p -1\}\)

\(A\) 构成模 \(p\) 乘法的简化剩余系,即任意 \(i\in A\),均存在 \(j\in A\),使得 \(ij \equiv 1 \pmod p\)

但是 \(A\) 中的元素是不一定两两配对,需要考虑这种情况:

\[x^2 \equiv 1\pmod p \]

解得 \(x \equiv 1 \pmod p\)\(x\equiv p - 1 \pmod p\)

其余两两配对,得 $( p - 1 )! \equiv (p-1) \equiv -1 \pmod p $

判定质数:

首先如果 \(n\) 为合数,显然存在 \(n=ij\)

我们另 \(i\le j\),得 \(i\le \sqrt n\)

枚举 \(i\),复杂度为 \(\mathcal{O}(\sqrt n)\)

但是这样就显得太落后时代发展,如果 \(n\le 10^{18}\) 呢?

考虑 Miller_Rabin 算法。

前置知识:费马小定理。

指的是当 \(p\) 为质数时,\(a^{p-1}\equiv 1\pmod p\)

证明在下面的欧拉定理中有写。

令判断的数为 \(x\),显然我们可以找一个质数 \(p\),当 \(x=p\) 时,\(x\) 为质数,当 \(p\mid x\) 时,\(x\) 为合数。

然后判断 \(p^{x-1}\bmod x\) 是否为 \(1\),如果不是,则 \(x\) 必然不是质数。

虽然但是,如果是,\(x\) 也必然不是质数。

否则,考虑二次探测定理。

显然 \(x^2\equiv1\pmod p\) 时,\(x\equiv 1\pmod p\)\(x\equiv p-1\pmod p\)

证明挺简单,这里懒得证。

先用 \(k\) 记录 \(x-1\)

然后先将 \(k\) 除以 \(2\),令 \(t=p^k\bmod x\)

如果 \(t\not =1\)\(t\not = x-1\),则根据二次探测定理,\(x\) 不是质数。

\(t=x-1\),则无法继续用二次探测定理,认为 \(x\) 是质数。

否则一直除,直至 \(k\) 为奇数,此时默认其为质数。

很显然这个东西有可能是错的,于是考虑多测几个 \(p\),提高准确率。

复杂度 \(\mathcal{O}(c\log n)\)\(c\) 为选的质数个数,总复杂度还是优于 \(\mathcal{O(\sqrt n)}\)

经过检验,选 \(c\) 个质数时,如果操作得当,出错的概率仅为 \(\dfrac{1}{4^c}\)

目前没用任何能够低于 \(\sqrt n\) 的判断质数的方法,但在 OI 界中,当 \(n\le 2^{78}\) 时,取前 \(12\) 个质数做 MR 是绝对正确的。

感觉错误概率很可以忽略了。

好像过程并不是不能理解。

B2085 CODE

逆元:

定义:对于两个整数 \(x,p\),若 \(xy\equiv 1\pmod p\) 时,则称 \(y\)\(x\) 的逆元,记做 \(y=x^{-1}\)

求法:当 \(p\) 是质数时,\(y\equiv x^{p-2}\pmod p\)

这里的 \(y\) 可以使用快速幂计算,而快速幂这种简单的算法想必大家都会。

逆元满足以下几个性质:

  • \([1,p)\) 的逆元互不相同。

证明:采用反证法,假设存在 \(x,y\),满足 \(x\not= y\)\(x,y\) 的逆元均为 \(i\)\(xi\equiv yi\pmod p\)

两边同时除以 \(i\),得出 \(x\equiv y\pmod p\),矛盾。

  • \(x\) 在以 \(p\) 为模数时存在逆元当且仅当 \(\gcd(x,p)=1\)

证明:反证,设存在 \(x\) 的逆元,\(xx^{-1}\equiv1\pmod p\)

\(xx^{-1}=kp+1,k\in \mathbb{Z}\)

\(d=\gcd(x,p)\),则 \(\dfrac{xx^{-1}}{d}=\dfrac{kp+1}{d}\)

\(xx^{-1}\equiv 0\pmod d,kp+1\equiv 1\pmod d\),而 \(d>1\),矛盾。

于是同理可得推论 \([1,p)\) 中所有数存在逆元当且仅当 \(p\) 为质数。

如果 \(p\) 不为质数但是 \(\gcd(x,p)=1\),考虑用 exgcd 求逆元。

  • 线性求逆元

对于求 \(i\) 的逆元:

\(p=ki+r(0\le k,r<p)\)

\[k=\lfloor \dfrac{p}{i}\rfloor \]

\[r=p-ki \]

\[ki+r\equiv 0\pmod p \]

同乘 \(i^{-1}r^{-1}\),得 \(i^{-1}+k\times r^{-1}=0\)

\[i^{-1}\equiv -k\times r^{-1} \]

for(int i = 2; i <= n; i++) inv[i] = 1ll * (p - p / i) * inv[p % i] % p;

组合数

\[\binom{n}{m}=\dfrac{n!}{m!(n-m)!} \]

引理:\(n\ge m\) 时,\(\binom{n}{m}=\binom{n}{n-m}\)

帕斯卡法则

根据组合数的定义,显然满足

\[\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m} \]

二项式定理:

考虑通过组合数的定义证明。

\((x+y)^n\) 对于每一项要么取 \(x\),要么取 \(y\),那么取了 \(i\)\(x\) 的方案数为 \(\binom{i}{n}\),故得证。

\[(x+y)^n=\sum\limits_{i=0}^{n}\binom{i}{n}x^iy^{n-i} \]

卢卡斯定理:

\[\binom{n}{m}\bmod p=\binom{\lfloor\dfrac{n}{p}\rfloor}{\lfloor\dfrac{m}{p}\rfloor}\times \binom{n\bmod p}{m\bmod p}\bmod p \]

证明:

首先 \(\binom{p}{f}\equiv 0\pmod p\)

\(n=sp+q,m=tp+r\)

\[(x+1)^n \]

\[\equiv(x+1)^{sp+q} \]

\[\equiv((x+1)^p)^s(x+1)^q(1+x^p)^ s(x+1)^q\pmod p \]

\[\equiv\sum\limits_{i=0}^{s}\binom{s}{i}x^{ip}\sum\limits_{j=0}^q \binom{q}{j} x^j\pmod p \]

\(x^m\) 项的系数为

\[\binom{sp+q}{tp+r} \]

不难发现只有 \(i=q,j=t\) 时可以取到系数,故

\[\binom{sp+q}{tp+r}\equiv\binom{s}{t}\binom{q}{r}\pmod p \]

得证。

P3807 CODE

由于懒得写,用了 Acwing 的模板。

欧拉函数

\(\varphi(n)\) 表示 \(1,2,\cdots n\) 中与 \(n\) 互质的数。

性质 \(1\):若 \(p\) 为质数,则 \(\varphi(p)=p-1\)

废话。

性质 \(2\)\(\varphi\) 是积性函数。

前置知识:积性函数。

\(f(n)\) 满足 \(\forall \gcd(p,q)=1,f(pq)=f(p)f(q)\),则称 \(f\) 是积性函数。

积性函数的性质:

\(f,g\) 为积性函数时,则以下函数同样为积性函数:

\[h(x)=f(x^p) \]

\[h(x)=f^p(x) \]

\[h(x)=f(x)g(x) \]

\[h(x)=\sum\limits_{d\mid x}f(d)g(\dfrac{x}{d}) \]

欧拉函数 \(\varphi\)、莫比乌斯函数 \(\mu\),单位函数 \(?\)、因数个数 \(d\) 等都是常见的积性函数。

\([n]\) 表示 \(\{1,2,\dots, n\}(n>0)\)。设 \(n\)\(k\) 个不同的质因子:\(p_1 < p_2 < \dots < p_k\),由容斥原理有

\[\begin{aligned} \varphi(n) &= \sum_{I\subseteq [k]} (-1) ^{|I|} \frac{n}{\prod_{i\in I}p_i} \\ &= n\sum_{I\subseteq [k]} 1^{n - |I|} \prod_{i\in I} -\frac{1}{p_i} \\ &= n (1 - \frac1{p_1}) ( 1 - \frac1{p_2}) \dots (1 - \frac1{p_k}) \end{aligned} \]

故得证。

性质 \(3\)

\[\sum\limits_{d|n}\varphi(d)=n \]

考虑 \(d\mid n\) 时,\(\sum\limits_{i=1}^n [\gcd(n,i)=d]=\varphi(d)\)

显然 \(\gcd(n,i)\mid n\)

所以 \(\sum\limits_{d|n}\sum\limits_{i=1}^n [\gcd(n,i)=d]=n\)

于是 \(\sum\limits_{d|n}\varphi(d)=n\) 成立。

欧拉定理:

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

证明:

取模 \(p\) 的缩系 \(a_1,a_2\cdots a_{\varphi(p)}\),则 \(aa_1,aa_2\cdots aa_{\varphi(p)}\) 也为模 \(p\) 的缩系。

于是

\[\prod\limits_{i=1}^{\varphi(p)}a_i\equiv \prod\limits_{i=1}^{\varphi(p)}\pmod p \]

得出结论:

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

\(p\) 为质数时,该定理退化成费马小定理。

\[a^{p-1}\equiv 1\pmod p \]

于是费马小定理就不证了。

因此 \(a^{\varphi(p)}\bmod p=1\),于是可得扩展欧拉定理:

\(b\ge \varphi(p)\) 时,

\[a^b\equiv a^{b\bmod \varphi(p)+\varphi(p)}\pmod p \]

P5091 CODE

质因数分解:

  1. 唯一分解定理

  2. Pollard-Rho 算法

这是一个能够找到 \(x\) 的素因子的方法。

考虑球出 \(x\) 的最大约数 \(y\),且 \(y\not=x\)

显然你可以 \(\mathcal{O}(\sqrt x)\) 试除,但是这个显然严重落后了。

我们考虑找一个 \(s\),令 \(g=\gcd(s,x)\),如果 \(1<g<x\),则找到了一个质因子 \(g\),此时将 \(g\)\(\dfrac{x}{g}\) 递归分解即可。

\(\gcd\) 在后文有讲快速求 \(\gcd\) 的更相减损术,这个东西能够大大优化。

这里找 \(s\) 需要用到随机化。

前置知识:生日悖论

考虑一个班如果有 \(x\) 个人,那么这 \(x\) 个人中有任意两个人的生日时间相同的概率是多少呢?

考虑没有人生日相同的概率,显然是 \(\prod\limits_{i=1}^{x}\dfrac{365-i+1}{365}\),所以有人生日相同的概率就是 \(P(x)=1-\prod\limits_{i=1}^{x}\dfrac{365-i+1}{365}\)

根据这个柿子可以得出,一个班只要有 \(23\) 个人,有人生日重复的概率就超过了 \(50\%\)。当 \(x=60\) 时,\(P(x)\approx 0.9999\)

考虑令 \(v_i=v_{i-1}^2+t\bmod n\) 来生成伪随机数列,\(v_0\)\(t\) 都是随机数。

然后每次考虑令 \(s=|v_i-v_0|\) 进行判断,但是毕竟更相减损术也是 \(\mathcal{\log}\) 的,还要继续判断。

如果成环的话可以直接退出,然后修改 \(v_0\)\(t\) 重新分解。

根据生日悖论,环长最多为 \(\mathcal{O}(\sqrt x)\)

你说得对,但是直接爆搜也是 \(\mathcal{O}(\sqrt x)\) 的,你这一通操作也没见你优化啊。

这里考虑到这个 \(s\) 每次都算 \(\gcd\) 有点消耗时间,所以我们累积几次,把 \(s\) 相乘并取模,因为取模不会改变 \(\gcd\)

那隔的时间如何确定呢?

考虑倍增优化。

\(i=2^k,k\in\mathbb{N}\) 时,我们可以令 \(v_0=v_i\),然后将累积的 \(s\) 算一遍 \(\gcd\)

这样可以优化复杂度。

具体我不会证,但是大概在 \(\mathcal{O}(n^{\frac{1}{4}})\) 左右,运行起来的效率相当不错。

题外话:由于没有 npy,随机种子用的是我的生日(

P4718 CODE

线性筛

考虑如何判断 \([1,10^8]\) 的所有整数是不是质数,如果 MR 的话很显然会 TLE,考虑如何优化。

我们可以考虑整一个 \(\mathcal{O}(n)\) 的算法,对于每个 \(i\),将它的倍数全部标记为合数,这样递推下去,复杂度 \(\sum\limits_{i=1}^n \dfrac{n}{i}=\mathcal{O}(n\log n)\)

我们考虑到如果一个数轮到它了还没有被标记,说明它是个质数。

显然我们希望对于一个合数,我们只筛一次,这样复杂度就对了。

我们考虑把所有质数都保存下来,存为 \(p\),这里的 \(p\) 单调上升,每次就标记 \(i\times p_j\)

\(p_j\mid i\) 时,显然之后的 \(p_k\times i\) 的最小质因子是 \(p_j\) 了,所以此时停止筛。

P3383 CODE

然后考虑如何筛 \(\varphi\)

\(i\) 为质数时,\(\varphi(i)=i-1\)

接下来继续枚举 \(i\times p_j\),如果 \(p_j\mid i\),则这个 \(\varphi (i\times p_j)\) 怎么求呢?

考虑推柿子。

\[\varphi(i\times p_j)=i\times p_j\times \prod \limits_{x\mid p_j\times i\in \mathbb{P}} \dfrac{x-1}{x}=i\times p_j\times \prod \limits_{x\mid i\in \mathbb{P}} \dfrac{x-1}{x} \]

\[\varphi(i)=i\times \prod \limits_{x\mid i\in \mathbb{P}} \dfrac{x-1}{x} \]

\(\varphi(i\times p_j)=\varphi(i)\times p_j\)

否则,\(\gcd(i,p_j)=1\),根据 \(\varphi\) 时一个积性函数,得 \(\varphi(i\times p_j)=\varphi(i)\times \varphi(p_j)=\varphi(i)\times (p_j-1)\)

P8670 CODE

扩展欧几里得

先介绍一下最大公约数。

\(\gcd(a,b)\) 表示 \(a\)\(b\) 的最大公约数,例如 \(\gcd(4,12)=4\)\(\gcd(54,72)=18,\gcd(15,80)=1\)

注意 \(\gcd(0,x)=x\)

考虑用辗转相减法求 \(\gcd(a,b)\)

显然 \(\gcd(a,b)=\gcd(b,a- b)\) 的证明比较简单,这里不多赘述。

同理得 \(\gcd(a,b)=\gcd(b,a\bmod b)\)

复杂度 \(\mathcal{O(\log a)}\)

int gcd(int a, int b) {
	while(a && b) {
		if(a > b) a %= b;
		else b %= a;
	}
	return a + b;
}

当然也可以用更相减损术,复杂度不变,但是可以优化常数用。

\[\gcd(a,b) = \left \{ \begin{aligned} &\gcd(b,a-b)\ && a\bmod 2=1\ b\bmod 2=1 \\ &\gcd(\dfrac{a}{2},b)\ && a\bmod 2=0\ b\bmod 2=1 \\ &\gcd(a,\dfrac{b}{2})\ && a\bmod 2=1\ b\bmod 2=0 \\ &\gcd(\dfrac{a}{2},\dfrac{b}{2})\times 2\ && a\bmod 2=0\ b\bmod 2=0 \\ \end{aligned} \right. \]

虽然也是 \(\mathcal{O}(\log a)\) 的,但是常数明显减小,近似 \(\mathcal{O}(1)\)

#define ctz __builtin_ctz
inline int gcd(int a,int b) {
    int az = ctz(a), bz = ctz(b), z = (az > bz) ? bz : az, t; b >>= bz;
    while(a) a >>= az, t = a - b, az = ctz(t), b = min(a, b), a = t < 0ll ? -t : t;
    return b << z;
}

基于值域预处理的快速 \(\gcd\)

是一种 \(\mathcal{O}(w)\) 预处理,严格 \(\mathcal{O}(1)\) 查询的 \(\gcd\)

引理:

若一个数 \(n\) 存在一组 \(a,b,c\),使得 \(n=abc,a\le b\le c,a,b\le \sqrt n\)\(c\le \sqrt n\) 或者 \(c\) 为质数。

证明:考虑使用数学归纳法,\(n=1\) 时显然成立。

\(p\)\(n\) 的最小质因数。\(a',b',c'\)\(\dfrac{n}{p}\) 的一种合法分解。

\(p\le n^{\frac{1}{4}}\),则 \(a'\le (\dfrac{n}{p})^{\frac{1}{3}}\),所以 \(pa\le p(\dfrac{n}{p})^{\frac{1}{3}}\le \sqrt n\),所以 \((pa',b',c')\) 是一组符合条件的解。

否则,若 \(a'>p\),则 \(n=pa'b'c'>p^4>n\),矛盾。故 \(a'\le p\),又因为 \(p\)\(n\) 的最小质因数,故 \(a'=1\)\((p,b,c)\) 是一组合法的解。

证明完了,但是好像没啥用啊???

上面的证明也构造了拆 \(a,b,c\) 的方法,线性筛一下即可。

在求 \(\gcd(n,m)\) 时,可以将答案拆成:

\[\gcd(a,m)\times \gcd(b,m)\times \gcd(c,m) \]

先求 \(a,b\) 的答案,\(\gcd(a,m)=\gcd(a,m\bmod a)\)

显然 \(a,m \bmod a\le \sqrt n\),所以直接预处理 \(\sqrt n\) 以下的 \(\gcd\) 即可。

对于 \(c\),如果 \(c\) 是个质数显然很好求,如果不是则根据引理 \(c\le \sqrt n\),套用上面的方法即可。

P5435 CODE

\(1.\) 裴蜀定理:

\(ax+by=c\) 的充要条件为 \(\gcd(a,b)\mid c\)

证明:

\(1.\) 必要性:

\(d=\gcd(a,b)\),显然 \(d\mid a,d\mid b\),因为 \(x,y\in \N^+\),所以 \(d\mid ax,d\mid by,d\mid c\),得证。

充分性:由扩展欧几里得算法必然可以构造出 \(ax+by=c\) 的解

扩展欧几里得算法:

首先,设 \(\gcd(a,b)=g\),于是考虑求解 \(ax+by=g\) 的解,解出的解设为 \(x_0,y_0\),则原方程的解为 \((\dfrac{x_0c}{g},\dfrac{y_0c}{g})\)

于是现在考虑构造 \(ax+by=g\) 的解。

不妨设 \(a>b\)

\(b\mid a\) 时,解得 \(x=0,y=1\)

根据 \(\gcd(a,b)=\gcd(b,a\bmod b)\),考虑递归解 \(bx'+(a\bmod b)y'=\gcd(b,a\bmod b)\),而右式不变。

由于是递归求解,所以我们假设已知 \(x',y'\),考虑递推回去解原方程 \(ax+by=\gcd(a,b)\)

首先,将取模换成除法。

\[a\bmod b=a-b\lfloor\dfrac{a}{b}\rfloor \]

代入,得 \(bx'+(a-b\lfloor\dfrac{a}{b}\rfloor)y'=\gcd(a,b)\)

根据乘法分配律得 \(bx'+ay'-b\lfloor\dfrac{a}{b}\rfloor y'=\gcd(a,b)\)

带入 \(ax+by=\gcd(a,b)\),得 \(bx'+ay'-b\lfloor\dfrac{a}{b}\rfloor y'=ax+by\)

根据等式的性质,得出 \(x=y',y=x'-b\lfloor\dfrac{a}{b}\rfloor\) 为原方程的一组特解。

中国剩余定理

给定 \(n\) 组非负整数 \(a_i, b_i\) ,求解关于 \(x\) 的方程组的最小非负整数解。

\[\begin{cases} x\equiv a_1\pmod {m_1} \\ x\equiv a_2\pmod {m_2} \\ \cdots \\ x \equiv a_n\ \pmod {m_n}\end{cases} \]

中国剩余定理:

\(M=\prod\limits_{i=1}^{n}m_i\bmod p,M_i=\dfrac{M}{m_i}\)

\(t_i\)\(M_i\)\(m_i\) 为模数的逆元,即 \(t_iM_i\equiv 1\pmod {m_i}\)

\(x\) 的最小非负整数解为

\[x=\sum\limits_{i=1}^{n}a_it_iM_i\bmod p \]

证明:

由假设可知,对于所有 \(i\in\{1,2,\cdots n\}\),由于 \(\forall j\in\{1,2,\cdots n\},j\not =i,\gcd(m_i,m_j)=1\),所以可得 \(\gcd(m_i,M_i)=1\),所以必然存在 \(t_i\),满足 \(t_iM_i\equiv 1 \pmod {m_i}\)

再看一下这个式子:

\[a_it_iM_i \]

不难发现,\(t_iM_i\equiv 1\pmod p\),所以 \(a_it_iM_i\equiv a_i\pmod {m_i}\)

\[\forall j\in\{1,2,\cdots n\},j\not =i,a_it_iM_i\equiv 0\pmod {m_j} \]

所以 \(x=\sum\limits_{i=1}^{n}a_it_iMi\bmod p\) 满足

\[\forall i\in\{1,2,\cdots n\},x\equiv a_it_iM_i+\sum\limits_{j\not=i}a_jt_jM_j\equiv a_i\pmod {m_i} \]

\(x_1,x_2\) 均为方程的解,显然 \(x_1\equiv x_2\pmod M\)

于是解集为

\[\{kM+\sum\limits_{i=1}^{n}a_iy_iM_i\},k\in \mathbb{Z} \]

练习 P1495

整除分块

引理:

\[\forall a,b,c\in \mathbb{Z},\left\lfloor\dfrac{a}{bc}\right\rfloor = \left\lfloor{\dfrac{\left\lfloor\dfrac{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\dfrac{a}{b}\times\dfrac{1}{c}\right\rfloor = \left\lfloor{\dfrac{1}{c}\times\left({\left\lfloor{\dfrac{a}{b}}\right\rfloor + r}\right)}\right\rfloor = \left\lfloor{\dfrac{\left\lfloor\dfrac{a}{b}\right\rfloor}{c} + \dfrac{r}{c}}\right\rfloor = \left\lfloor{\dfrac{\left\lfloor{\dfrac{a}{b}}\right\rfloor}{c}}\right\rfloor \]

例题 \(1\)

\[\sum\limits_{i=1}^n\lfloor\dfrac{n}{i}\rfloor \]

显然直接算是 \(\mathcal{O(n)}\) 的,考虑优化。

不难发现有许多 \(\lfloor\dfrac{n}{i}\rfloor\) 的值是一样的,而且这些一样的值是呈块状分布。

证明不难,考虑当 \(i,j>0,i<j\) 时,\(\lfloor\dfrac{n}{i}\rfloor\ge \lfloor\dfrac{n}{j}\rfloor\)

于是考虑对于每个块的长度和每块中每个数的值求出,就可以直接算贡献了。

如果说一个块的左端点是 \(l\) 的话,那么右端点 \(r\)

\[\left\lfloor\dfrac{n}{\lfloor\frac{n}{l}\rfloor}\right\rfloor \]

证明:

\(k=\lfloor\dfrac{n}{l}\rfloor\)

假如要找到 \(p\),使得 \(\lfloor\dfrac{n}{p}\rfloor<k\),即

\[\dfrac{n}{p}<k \]

\[p>\dfrac{n}{k} \]

所以说,想要找到右端点 \(r\),需要 \(r\le \dfrac{n}{k}\),即 \(r=\left\lfloor\dfrac{n}{\lfloor\frac{n}{l}\rfloor}\right\rfloor\)

接下来是复杂度分析。

考虑整块都可以直接处理,复杂度为 \(O(\sqrt n)\)

证明:令块左端点为 \(i\)

\(i\le \sqrt n\) 时,总共只有 \(\sqrt n\)\(i\)

\(i>\sqrt n\) 时,\(\lfloor\dfrac{n}{i}\rfloor< \sqrt n\),即 \(\lfloor\dfrac{n}{i}\rfloor\) 的种类数不会超过 \(\sqrt n\)

所以复杂度为 \(\mathcal{O(\sqrt n)}\)

long long ans = 0;
for(int l = 1, r; l <= n; l = r + 1) {
	r = n / (n / l);
	ans += 1ll * (r - l + 1) * (n / l);
} 

例题 \(2\)

\[\sum\limits_{i=1}^nk\bmod i \]

考虑同样的套路:

\[\sum\limits_{i=1}^nk\bmod i \]

\[=\sum\limits_{i=1}^n k-i\lfloor\dfrac{k}{i}\rfloor \]

\[=nk-\sum\limits_{i=1}^n i\lfloor\dfrac{k}{i}\rfloor \]

然后沿用套路即可,等差数列求和想必大家都会。

例题 \(3\)

P3935 Calculating

不难发现 \(f(x)\)\(d(x)\),其中 \(d(x)\) 表示 \(x\) 的约数个数。

显然 \(d(n)\) 是积性函数。所以直接硬上杜教筛。

于是问题就转化成了求:

\[\sum\limits_{i=1}^n d(i) \]

考虑对于所有 \([1,n]\) 的正整数 \(i\),其作为约数在 \([1,n]\) 中出现了 \(\lfloor\dfrac{n}{i}\rfloor\) 次。

直接套例题 \(1\) 即可。

例题 \(4\)

P2260 [清华集训2012] 模积和

考虑先容斥,得原式为

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^m (n\bmod i)(m\bmod j)-\sum\limits_{i=1}^n (n\bmod i)(m\bmod i) \]

\[=\sum\limits_{i=1}^n n\bmod i\sum\limits_{j=1}^m m\bmod j-\sum\limits_{i=1}^n (n\bmod i)(m\bmod i) \]

左边这部分直接套例题 \(2\) 即可。

考虑计算

\[\sum\limits_{i=1}^n (n\bmod i)(m\bmod i) \]

\[=\sum\limits_{i=1}^n(n-i\lfloor\dfrac{n}{i}\rfloor)(m-i\lfloor\dfrac{m}{i}\rfloor) \]

展开,得

\[=\sum\limits_{i=1}^nnm-mi\lfloor\dfrac{n}{i}\rfloor-ni\lfloor\dfrac{m}{i}\rfloor+i^2\lfloor\dfrac{n}{i}\rfloor\lfloor\dfrac{m}{i}\rfloor \]

\[=n^2m+\sum\limits_{i=1}^n-mi\lfloor\dfrac{n}{i}\rfloor-ni\lfloor\dfrac{m}{i}\rfloor+i^2\lfloor\dfrac{n}{i}\rfloor\lfloor\dfrac{m}{i}\rfloor \]

整除分块一下即可。注意到

\[\sum\limits_{i=1}^n i^2=\dfrac{n(n+1)(2n+1)}{6} \]

CODE

我们定义 \(a^b\)\(b\)\(a\) 相乘,即 \(a^b = \underbrace{a \times a \times \cdots \times a}_{b \text{ 次}}\)

幂满足以下性质:

\[a^m\times a^n=a^{m+n} \]

\[\dfrac{a^m}{a^n}=a^{m-n} \]

那么接下来我们考虑求 \(a^b \bmod p\),其中 \(b\le 10^9\)

显然直接 \(\mathcal{O(b)}\) 乘是不行的,考虑利用上面的性质,将 \(b\) 拆成 \(\mathcal{O}(\log b)\) 个数的和,然后直接乘即可。

考虑将 \(b\) 二进制分解,每次 \(a\) 自己乘自己,如果说 \(b\) 在二进制的这一位是 \(1\) 就乘上 \(a\),这样复杂度是 \(\mathcal{O}(\log b)\) 的。

比如说,当 \(a=3,b=6,p=10^9\) 时:

维护一个答案 \(q\),初始时 \(q=1\)

观察到 \(b\) 二进制最后一位不是 \(1\),直接将 \(a\) 自乘,此时 \(a=9,b=3,q=1\)

此时 \(b\) 二进制最后一位是 \(1\),答案先乘 \(a\),然后将 \(a\) 自乘,此时 \(a=81,b=1,q=9\)

最后 \(b\) 的二进制还是 \(1\),答案先乘 \(a\),然后将 \(a\) 自乘,此时 \(a=6561,b=0,q=729\)

当某些时候快速幂也不管用时,考虑维护一个 \(\mathcal{O}(1)\) 的快速幂。

光速幂是指在底数和模数确定时,可以做到 \(\mathcal{O}(\sqrt w)\) 预处理,\(\mathcal{O}(1)\) 查询的快速幂,\(w\) 为指数的范围。

考虑类似于根号分治的思想,如果我们处理出以 \(1,2,\cdots B\) 为指数的答案,以及 \(1,2,\cdots n\) 中所有 \(B\) 的倍数的答案,那么 \(\forall i\in [1,n]\)\(2^i\) 都可以利用这两组数据的乘积得出。

复杂度为 \(\mathcal{O}(B+\dfrac{n}{B})\),显然 \(B=\sqrt n\) 时复杂度最优。

LOJ #162 CODE

你也可以用类似的方法解决 P5072 [Ynoi2015] 盼君勿忘
的一部分。

BSGS 算法:

阶和原根:

\(a^b\equiv 1\pmod p\) 时,且此时 \(b\) 是满足这一条件的最小正整数解,我们称 \(a\)\(p\) 的阶为 \(b\)。记作 \(\delta_p(a)\)

四个性质:

  1. \(a,a^2\cdots a^{\delta_p(a)}\)\(p\) 后互不相同。

考虑反证法,设 \(a^i\equiv a^j\pmod p,i,j\le \delta_p(a)\),则 \(a^{j-i}\equiv 1\pmod p\)\(j-i<\delta_p(a)\),与最小性矛盾。

  1. \(a^x\equiv 1\pmod p\),则 \(\delta_p(a)\mid x\)

\(y=\delta_p(a)\)

继续考虑反证法,令 \(x=ky+b,b<y\)

\(a^b\equiv a^{ky}\times a^b\equiv 1\pmod p\),与阶的最小性矛盾。

  1. \(\gcd(a,p)=\gcd(b,p)=1\),则 \(\delta_p(a)\delta_p(b)=\delta_p(ab)\) 的充要条件是 \(\gcd(\delta_p(a),\delta_p(b))=1\)

必要性:

显然 \(a^{\delta_p(a)}\equiv b^{\delta_p(b)}\equiv 1\pmod p\)

所以 \(ab^{\operatorname{lcm}(\delta_p(a),\delta_p(b))}\equiv 1\pmod p\)

由性质二得 \(\delta_p(ab)\mid \operatorname{lcm}(\delta_p(a),\delta_p(b))\)

\(\delta_p(a)\delta_p(b)\mid \operatorname{lcm}(\delta_p(a),\delta_p(b))\)

又因为 \(\delta_p(a)\delta_p(b)=\operatorname{lcm}(\delta_p(a),\delta_p(b))\times \gcd(\delta_p(a),\delta_p(b))\)

所以 \(\gcd(\delta_p(a),\delta_p(b))=1\)

充分性:

\[(ab)^{\delta_p(ab)}\equiv 1\pmod p \]

\[(ab)^{\delta_p(ab)\delta_p(b)}\equiv 1\pmod p \]

\[a^{\delta_p(ab)\delta_p(b)}\equiv 1\pmod p \]

\[\delta_p(a)\mid \delta_p(ab)\delta_p(b) \]

又因为 \(\gcd(\delta_p(a),\delta_p(b))=1\),得 \(\delta_p(a)\mid \delta_p(ab)\)

同理可得 \(\delta_p(b)\mid \delta_p(ab)\)

由于 \(\gcd(\delta_p(a),\delta_p(b))=1\),则 \(\delta_p(a)\delta_p(b)=\delta_p(ab)\)

重新推一遍:

\[(ab)^{\delta_p(ab)}\equiv 1\pmod p \]

\[(ab)^{\delta_p(a)\delta_p(b)}\equiv 1\pmod p \]

\[(a^{\delta_{p}(a)})^{\delta_p(b)} (b^{\delta_p(b)})^{\delta_p(a)}\equiv 1\pmod p \]

\(\delta_p(ab)\mid \delta_p(a)\delta_p(b)\)

结合上式,得 \(\delta_p(a)\delta_p(b)=\delta_p(ab)\)

性质 \(4\)

\(\gcd(a,p)=1\),则 \(\delta_p(a^k)=\dfrac{\delta_p(a)}{\gcd(\delta_p(a),k)}\)

证明:

\[a^{k\delta_p(a^k)}=(a^k)^{\delta_p(m)\delta_p(a^k)}\equiv 1\pmod p\\ \delta_p(a)\mid k\delta_p(a^k)\\ \dfrac{\delta_p(a)}{\gcd(\delta_p(a),k)}\mid \delta_p(a^k) \]

又有

\[(a^k)^{\frac{\delta_p(a)}{\gcd(\delta_p(a),k)}}=(a^{\delta_p(a)})^{\frac{k}{\gcd(\delta_p(a),k)}}\equiv 1\pmod p \]

\[\delta_p(a^k)\mid \dfrac{\delta_p(a)}{\gcd(\delta_p(a),k)} \]

综上,\(\delta_p(a^k)=\dfrac{\delta_p(a)}{\gcd(\delta_p(a),k)}\)

原根:若 \(\varphi(m)=\delta_m(a)\)\(\gcd(a,m)=1\),则我们称 \(m\)\(a\) 的原根。

一个数 \(x\) 存在原根当且仅当 \(x\in \{2,4,p^k,2p^k\}\),其中 \(k\) 为正整数。

显然若一个数 \(g\)\(m\) 的原根,则 \(g,g^2,\cdots g^{\varphi(m)}\)构成模 \(m\) 意义下的既约剩余系,由于 \(\gcd(g,m)=1\),所以 \(\gcd(g^x,m)=1\),且剩余系各个数互不相等。

由于性质一,原根一定在 \(g,g^2,g^3\cdots g^{\varphi(m)}\) 之间。

王元于 \(1959\) 年证明了,若 \(m\) 有原根,则最小原根是 \(m^{0.25}\) 级别的,所以我们可以直接枚举最小原根 \(g\)

线性筛 \(\varphi\),然后枚举 \(k\),排个序输出即可。

P6091 CODE

为了反驳 @hh弟中弟 的评论,我放一句不对的话:

posted @ 2023-05-27 14:03  Stitch0711  阅读(126)  评论(0)    收藏  举报