数学杂项
素数与同余
素数个数定理
-
记 \(\leqslant x\) 的素数个数为 \(\pi(x)\),则有 \(\pi(x)\sim\dfrac{x}{\ln x}\)。
-
不会证。微积分?
数列
Fibonacci 数列
-
证明如下:
-
定理 \(1\):\(\gcd(F_n,F_{n+1})=\gcd(F_n,F_{n+2})=1\)。
-
\(\gcd(F_n,F_{n+1})=\gcd(F_n,F_{n+1}-F_n)=\gcd(F_n,F_{n-1})\),显然可以利用更相减损法无穷递降到 \(\gcd(F_1,F_2)=1\)。
-
\(\gcd(F_n,F_{n+2})\) 显然可以更相减损一次化归到上面这种形式。
-
-
定理 \(2\):\(F_{m+n}=F_{m+1}F_n+F_mF_{n-1}\)。
-
首先这里 \(m,n\) 是平等的(可以互换位置)。故我们归纳证明的时候实际上只用证一个。
-
考虑归纳证明这个东西。不妨令 \(F_0=0\),则当 \(n=m=1\),\(F_{1+1}=F_2F_1+F_1F_0\),显然成立。
-
然后不妨假设结论对 \(n,m\leqslant k\) 成立,试证明对 \(n=k+1\) 成立:
-
\(F_{m+n}=F_{m+k+1}=F_{m+k}+F_{m+k-1}=F_{m+1}F_k+F_mF_{k-1}+F_{m+1}F_{k-1}+F_mF_{k-2}\)
-
合并同类项,有 \(F_{m+n}=F_{m+1}F_{k+1}+F_mF_k=F_{m+1}F_n+F_mF_{n-1}\)。证毕。
-
为了直观的话,我们顺带把对 \(n,m\leqslant k\) 成立的 \(m=k+1\) 证一下:
-
\(F_{m+n}=F_{k+1+n}=F_{k+n}+F_{k-1+n}=F_{k+1}F_n+F_kF_{n-1}+F_kF_n+F_{k-1}F_{n-1}\)。这里的拆法稍有不同。
-
化一下,\(F_{m+n}=F_{k+2}F_n+F_{k+1}F_{n-1}=F_{m+1}F_n+F_mF_{n-1}\)。看到本质是对称证明。
-
-
定理 \(3\):\(\gcd(F_m,F_n)=F_{\gcd(m,n)}\)。
-
不妨令 \(m>n\),于是有:
-
\(\gcd(F_m,F_n)=\gcd(F_{m-n+n},F_n)\),由定理 \(2\):
-
\(F_{(m-n)+n}=F_{m-n+1}F_n+F_{m-n}F_{n-1}\)。
-
接下来分类讨论。
-
当 \(F_{m-n}F_{n-1}\leqslant F_n\):
-
显然此时 \(F_{m-n}<2\)(可参看博弈论-斐波那契博弈中的相关证明),即 \(m-n\leqslant 2\)。
-
由定理 \(1\),\(\gcd(F_m,F_n)=1=F_1=F_2\),又由 \(m-n\leqslant 2\) 知 \(\gcd(m,n)\leqslant 2\),结论成立。
-
-
当 \(F_{m-n}F_{n-1}>F_n\):
-
反复使用更相减损法,则 \(\gcd(F_m,F_n)=\gcd(F_{m-n}F_{n-1},F_n)\)。
-
由定理 \(1\),\(F_{n-1}\perp F_n\),故上式等价于 \(\gcd(F_{m-n},F_n)\)。
-
故我们相当于对求 \(\gcd\) 的两个 \(F\) 的下标在做更相减损。显然可以无穷递降得到 \(\gcd(m,n)\),故 \(\gcd(F_m,F_n)=F_{\gcd(m,n)}\)。
-
-
调和级数
\(\sum\limits_{i=1}^n\dfrac{1}{i} \sim O(\ln{n})\)
\(\sum\limits_{i=1}^n\dfrac{n}{i} \sim O(n\ln{n})\)
- 其中 \(\sim\) 表示趋近于。不会证,微积分?
不等式
排序不等式
- 给定两个单调不降的数列 \(a_{1\sim n},b_{1\sim n}\),定义其正序和、乱序和、逆序和分别为
-
总有正序和 \(\geqslant\) 乱序和 \(\geqslant\) 逆序和。
-
证明:反证法。
-
假设存在一种不同于正序的顺序可以取到最大,那么把 \(b\) 数组重新按当前序列编号,选择其中两个逆序对(\(i<j,b_i>b_j\)),交换后显然更优,与假设矛盾。
-
同理可证乱序和 \(\geqslant\) 逆序和。
-
方程式
高斯消元法
-
解多元一次方程式组。
-
实现原理:
-
枚举主元,找到一个含有该主元的方程。
-
使用加减消元法消去其他所有方程中的该主元。
-
反复直到解出。注意判同构(无解)情况。
-
double a[maxnum][maxnum];
bool same(double x,double y){return fabs(x-y)<eps?1:0;}
il void gauss(){
for(int i=1;i<=num;++i){//枚举主元
int pos=i;//pos是找的方程 a是系数,特别地,a[?][n+1] 是式右的结果
while(pos<num && same(a[pos][i],0.0)) ++pos;
if(same(a[pos][i],0.0)) continue;//寄了
else for(int j=1;j<=num+1;++j) swap(a[i][j],a[pos][j]);//把那个方程换上来
double now=a[i][i];
for(int j=1;j<=num+1;++j) a[i][j]/=now;//调一下系数,使得主元的系数是1
for(int j=1;j<=num;++j)//每一行地减过去
if(j!=i){
double now=a[j][i];//对应的该主元系数
for(int k=1;k<=num+1;++k) a[j][k]-=now*a[i][k];
}
}
}
手动消元
-
如果状态之间的边不强于一条双向链(关键是要依赖关系较为简单和有两个端口),则可以考虑手动消元。
-
譬如,考虑 \(n\) 个状态的链,\(f_i=p_{i,0}f_{i-1}+p_{i,1}f_{i+1}+x\),那么,可以通过如下的代入消元法(而非一般高效的加减消元法)加速解对应方程组:
-
不妨取边缘点,譬如 \(f_1\),为主元,于是可以利用 \(f_1=xf_2\) 表示出 \(f_2\)(以 \(kf_1+b\) 的形式)。
-
接着用这两者,利用 \(f_2\) 的方程表示出 \(f_3\)。故技重施,一路表示到 \(f_n\)。
-
此时还剩 \(f_n\) 的方程,将其中的 \(f_{n-1}\) 和 \(f_n\) 全部换成 \(kf_1+b\),于是可以直接算出 \(f_1\),倒回去可以算出每个 \(f\)。
-
-
复杂度 \(O(n)\),远优于高消。
CF1778D Flexible String Revisit
-
题意略。
-
注意到只关心不同的位置的个数,于是有 \(n\) 个状态。
-
这些状态之间的边显然有环...不过它们的边是邻项相连的。考虑手动消元。问题解决,复杂度 \(O(n)\)。
某 T1 离谱
编码
康托展开
-
康托展开用于给 \(1\sim n\) 的排列编号,排列 \(P\) 的编号就是字典序比 \(P\) 小的排列数 \(+1\)。
-
朴素的哈希方法显然是做成 \(n+1\) 进制数,但凭感觉就能知道,\(n\times (n+1)^{n-1}>>n!\)。
-
康托展开的办法则是,从排列本身的字典序出发。
-
公式不太好写,因为这个东西本质上是递推的。我们看一个例子:\([2,5,3,4,1]\)。
-
比第一位小的:\(1\times 4!\) 种。
-
第一位一样但是比第二位小:除去第一位。\(3\times 3!\) 种。
-
前两位一样但是比第三位小:\(1\times 2!\)。
-
前三位一样但是比第四位小:\(1\times 1!\)。
-
前四位都一样就确定了。
-
看到这个东西要求“还没有出现过的比我小的数量”,很树状数组。
-
故可以 \(O(n\log n)\) 地做。
-
现在我们有式子了:\(\sum\limits_{i=1}^n(a_i-1-get(a_i))\times (n-i)!\)。
-
注意这是“比我小的排列数”,排名的话,得再 \(+1\)。
众数
摩尔投票法
-
摩尔投票法是一种用于求序列的绝对众数的算法。
-
摩尔投票的流程如下:记录当前元素及其剩余个数。不断枚举新元素,若相同则增加个数,否则减少个数,若不存在已经记录的元素则记录它。
-
显然,其可以在 \(O(n)\) 的时间和 \(O(1)\) 的空间内求出绝对众数。当然,前提是其存在:如果不存在,那么摩尔投票的结果是无意义的。
-
应当指出的是,摩尔投票满足交换律和结合律。
P2397 yyy loves Maths VI (mode)
- 模板题,略。
P3765 总统选举
-
题意:给出数列 \(a_{1\sim n}\),\(m\) 次操作,每次查询 \([l_i,r_i]\) 的绝对众数,若不存在则以 \(s_i\) 为代替。将给出的 \(k_i\) 个位置的元素改为这个绝对众数。最后求整个序列的绝对众数,或报告不存在。
-
数据范围:\(n,m\leqslant 5\times 10^5,\sum k\leqslant 10^6\)。
-
显然因为摩尔投票满足结合律,我们可以用线段树求区间绝对众数。但区间可能并不存在绝对众数...
-
考虑使用平衡树来二分查找摩尔投票求出的绝对众数在区间内的出现次数。点名 set 迭代器不可减。
-
修改直接暴力修。
-
问题解决,复杂度 \(O(\sum k\log)\),鉴于较大点的时限也大,能过。
P7045 「MCOI-03」金牌
-
题意:交互。给出 \(n\) 个点,可以进行至多 \(2n-2\) 次询问,内容为 \((i,j)\) 是否不同色。求一条长为 \(n\) 的简单路径,相邻点不同色,或报告无解。
-
数据范围:\(T\leqslant 5\times 10^4,\sum Q\leqslant 10^5\)。
-
考虑魔改摩尔投票法。
-
维护一个队列,初始为 \(1\)。同时维护一条路径,初始也为 \(1\)。我们希望队头是路径尾元素,队中元素之间全部同色。
-
不断枚举新元素。若其与队头同色,则将其塞到队尾(其实塞到哪里大概是无所谓的,只要不是队头)。
-
否则,将队头弹出,将其加到路径尾,接着若还有队头则将队头加到路径尾,否则将其塞到队列中当队头。
-
-
显然,这一部分的复杂度至多为 \(n-1\)。问题在于队列中可能还剩了若干个同色元素需要塞进去。
-
考虑路径。如果队列中还有不在路径中的元素,则路径中的元素个数显然严格小于 \(n\)。挨个问过去,尝试插到间隔里,这一部分的复杂度也至多为 \(n-1\)。
-
至此我们有了一个 \(2n-2\) 次操作的做法,足够通过本题。