@
考试总结
\(OI\)数学是我的弱项之一,虽然我在文化课的学习中,数学都是为我拉分的,但是OI数学和高中数学还是有着很大的区别的。最主要的区别是,OI中的数学是工具,用来加快枚举或者找到规律快速推出结论,而高中的数学是纯粹的数与形的变换与结合,需要自己逐步推导,一步一步地演算出正确答案。从数上讲,OI数学很大一部分研究的是整数,即是数论了,其他情况下都是用实数(double)进行运算,而高中数学则讲究绝对的准确,对于如分数,无理数。这的确可以称得上的两个领域。
这两天考试,我得到的基本是大众分数,再次说明了我不太擅长数学。
Day1(190 points)
T1是个比较裸的扩展欧几里得,我花了5分钟把细节想好很快就过了样例,在手搓了几个数据过了后就没管了。期望100实际100。
T2我看了一个小时才猛然发现规律,一列的组合数的值就等于它右下角的那个组合数的值,也很好证明,代码挺简单的,但最好没有处理好边界情况,被卡了10分(其实卡10分已经很良心了,记得以前没判边界直接WA完了)。期望100实际90。
T3看了题解没看懂,说什么以前做过,可能是上一届做过吧,下来再找哪位A掉的同学请教下了。
Day2(100 points)
T1我还以为又是什么莫比乌斯反演,听了ltw讲后,才知道是考察对积性函数的理解和对线性筛的理解,果然我的数论还是欠缺了点。
T2开始没思路,后来发现第二个循环节的开头一定是个1,然后用BSGS算法可以轻松解出(这道题还要卡map,自己本地测大样例还要手写哈希表才可以过)。期望100实际100。
T3一直没思路。tqr作为打表大佬花了两个小时打表,推出了O(1)的算法,很厉害,但是我觉得这种方法并不是一直有效,比如上次我打表2h一点规律也没得出来。sxk讲了这道题的正解,数位dp,先用卢卡斯定理对组合数进行分解,然后每个分解出的组合数看成一位,这个思路必须对数位dp理解很深才可以想出来啊。
总的来说,这两次考试暴露了我数学上的很多漏洞,还需要大力填坑,这几日争取把洛谷的数学试炼场刷完,结论要尽量自己想,想不出来听了别人讲了后也要能自己独立推出来才行。
数论
扩展欧几里得
ta用于解二元一次不定方程:$$ax+by=c$$
我们先考虑解这个方程:$$ax+by=gcd(a,b)$$
如果\(gcd(a,b)|c\),那么方程有解,否则无解
怎么解呢?
既然$$ax+by=gcd(a,b)$$成立,那么易证下面这个式子也应该成立:
接下来可以一直迭代,直到\(b_n=0\),这时不难发现:$$a_n=gcd(a,b)$$
于是我们找到了一组特殊解:$$x_n=1,y_n=0$$
这时我们要做的是以这组特殊解倒推上一组方程的一组解。
由开始的两个式子可以做一些特殊的变化:
\(→\)
\(→\)
令$$x=y_1;y=x_1-\lfloor\frac{a}{b}\rfloor*y_1$$
就得到了上一层的解;
再一直回溯上去就可以得到最开始的方程的一组解了;
代码(超级好写):
int exgcd(ll &x,ll &y,ll a,ll b){
if(b==0){
x=1;
y=0;
return a;
}
ll g=exgcd(x,y,b,a%b);
ll z=x;
x=y;
y=z-a/b*y;
return g;
}
乘法逆元
如果让你求一个式子\(a/b(mod c)\)的结果,怎么办?
这时需要乘法逆元。
定义一个数\(x\)在模\(p\)意义下的逆元为\(inv_x\),可以记为\(x^{-1}\)。
满足$$x*inv_x=1(mod p)$$
有三种求法:
1.费马小定理(最好写)
左右同时乘以\(x^{-1}\)得到
然后直接快速幂即可求出逆元了
(费马小定理要求\(p\)为质数)
2.扩展欧几里得
求$$x*inv=1(mod p)$$
中的\(inv\)
可以把式子等价的写成
是不是很眼熟,套一下\(exgcd\)的板子就行了
(这里的\(p\)不一定是质数,只要满足\(x\)和\(p\)互质保证有解即可)
3.递推
可以\(O(n)\)地求出\(1-n\)中每个数在模\(p\)意义下的逆元
首先$$1*1^{-1}=1(mod p)$$
即\(inv_1=1\)
然后考虑把模数\(p\)化成如下形式
其中$$k=\lfloor\frac{p}{x}\rfloor$$$$b=p%x$$
显然$$kx+b=0(mod p)$$
两边同时乘以\(x^{-1}\)和\(b^{-1}\)得到$$kb{-1}+x{-1}=0(mod p)$$
由于\(b\)小于\(x\),那么\(b^{-1}\)一定已经已知
因此可以递推了:
inv[i]=(p-p/i)*inv[p%i]%p;
注意在\(-p/i\)前面加一个\(p\)是为了方便运算,防止复杂的负数取模
(扩展)中国剩余定理
中国剩余定理
参考自算法竞赛进阶指南
解同余方程组:
一个通解是:$$x = \sum\limits_{i=1}^n{a_iM_it_i}$$
其中 $$m = \prod\limits_{i=1}^nm_i$$
\(t_i\)是方程
的一个解
如果要求最小的非负整数解,只需把\(x\)取模即可。
(扩展)卢卡斯定理
求解:$$C^{m}_{n} (mod\ p)$$
即求把m、n写成p进制下每一位构成的组合数的乘积。