YZhe的头像

数学专题——学习笔记

@

考试总结

\(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*x_1+(a\%b)*y_1=gcd(a,b) \]

接下来可以一直迭代,直到\(b_n=0\),这时不难发现:$$a_n=gcd(a,b)$$
于是我们找到了一组特殊解:$$x_n=1,y_n=0$$
这时我们要做的是以这组特殊解倒推上一组方程的一组解。
由开始的两个式子可以做一些特殊的变化:

\[a*x+b*y=gcd(a,b) \]

\[b*x_1+(a\%b)*y_1=gcd(a,b) \]

\(→\)

\[a*x+b*y=gcd(a,b) \]

\[b_1*x+(a-\lfloor\frac{a}{b}\rfloor*b)*y_1=gcd(a,b) \]

\(→\)

\[a*x+b*y=gcd(a,b) \]

\[a*y_1+b*(x_1-\lfloor\frac{a}{b}\rfloor*y_1)=gcd(a,b) \]

令$$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^{p-1}=1(mod p) \]

左右同时乘以\(x^{-1}\)得到

\[x^{p-2}=x^{-1}(mod p) \]

然后直接快速幂即可求出逆元了
(费马小定理要求\(p\)为质数)

2.扩展欧几里得

求$$x*inv=1(mod p)$$
中的\(inv\)
可以把式子等价的写成

\[x*inv+p*y=1(mod p) \]

是不是很眼熟,套一下\(exgcd\)的板子就行了
(这里的\(p\)不一定是质数,只要满足\(x\)\(p\)互质保证有解即可)

3.递推

可以\(O(n)\)地求出\(1-n\)中每个数在模\(p\)意义下的逆元
首先$$1*1^{-1}=1(mod p)$$
\(inv_1=1\)
然后考虑把模数\(p\)化成如下形式

\[p=k*x+b \]

其中$$k=\lfloor\frac{p}{x}\rfloor$$$$b=p%x$$
显然$$kx+b=0(mod p)$$
两边同时乘以\(x^{-1}\)\(b^{-1}\)得到$$k
b{-1}+x=0(mod p)$$
由于\(b\)小于\(x\),那么\(b^{-1}\)一定已经已知
因此可以递推了:

inv[i]=(p-p/i)*inv[p%i]%p;

注意在\(-p/i\)前面加一个\(p\)是为了方便运算,防止复杂的负数取模

(扩展)中国剩余定理

中国剩余定理

参考自算法竞赛进阶指南

解同余方程组:

\[x\equiv a_n\pmod{m_n} \]

一个通解是:$$x = \sum\limits_{i=1}^n{a_iM_it_i}$$

其中 $$m = \prod\limits_{i=1}^nm_i$$

\[M_i=m/m_i \]

\(t_i\)是方程

\[M_it_i\equiv 1\pmod{m_i} \]

的一个解

如果要求最小的非负整数解,只需把\(x\)取模即可。

(扩展)卢卡斯定理

求解:$$C^{m}_{n} (mod\ p)$$

即求把m、n写成p进制下每一位构成的组合数的乘积。

\[ans=∏C^{m_i}_{n_i} (mod \ p) \]

莫比乌斯反演(待填)

杜教筛(待填)

函数(以下待填)

快速傅里叶变换(Fast Fourier Transformation)

快速数论变换(Number Theoretic Transforms)

快速沃尔什变换(Fast Walsh Transform)

矩阵(待填)

矩阵乘法及快速幂

矩阵加速

计算几何(没学)

posted @ 2019-10-12 08:12  YZhe  阅读(304)  评论(0编辑  收藏  举报
ヾ(≧O≦)〃嗷~