数学学习笔记

我还是第一次这么尴尬的写这种东西

首先%%%wangkoala学长!

一部分是对着PowerPoint写的~

简述一下学习成果~


1>卡特兰数

$Catalan$(这里用$h_i$来表示第$i$号卡特兰数)

首先是一个递推公式:

$h_n=h_0 \times h_{n-1}+h_1 \times h_{n-2} + \cdots + h_{n-1} \times h_0(n \geq 2)$

所以满足这个形式的就可以按卡特兰数处理咯

随后是通项公式:

$\begin{array}{lcl}h_n & = & C_{2n}^n-C_{2n}^{n-1}\\ & = & \frac{C_{2n}^n}{n+1}\end{array}$

应用:

1.求一个二叉树的形态方案数

2.求出入栈的顺序方案数

3.求有限制的方格行走方案

4.括号匹配

而且这些都可以转化成一个问题:把$1$和$-1$排列在数组中使前缀和大于$0$

1.可以把左儿子记为$1$右儿子记为$-1$,然后优先向左搜索。

2.可以把入栈记为$1$出栈记为$-1$

来个证明

首先设$k$为最后出栈的元素,

那么前面的元素必须在$k$压入之前弹出(不然$k$就不是最底层了)

后面的元素弹栈也必须弹出,才能把$k$弹出

这样就有式子:

$f_i=\sum\limits_{k=1}^{i}f_{k-1} \times f_{i-k}$

唔,我感觉和某个式子好像~~

对,就是递推公式!!!

3.这样的就是裸的:「链接」

S1

只能向右向上,不能穿越蓝线

那,怎么算方案?

其实还是$Catalan$数。

一种是你把向右记为$+1$,向上记为$-1$这样就可以按公式求了

总共是$2n$个加和减,所以是$h_n$

加上翻折

首先就是划一条辅助线,这条线是非法路径必须要过的

S2是这条。

然后翻折非法路径接触红线后的部分

(顺带把网格也翻过去)

数学学习笔记_第1张图片像这个,然后终点就被翻到了黄色矩形的右上角

于是答案就是

$C_{2n}^n-C_{2n}^{n-1}$

即:到终点的方案减到非法终点的方案

到终点走了$2n$步,其中向右占$n$步,就是$C_{2n}^n$

到非法重点走了$2n$步,其中向右占$n-1$步,是$C_{2n}^{n-1}$

然后还有一个提升版!

S4像这样

问题一样

 

翻折:

数学学习笔记_第2张图片那么好说了

到终点:走$n+m$步,向右占$n$就是$C_{n+m}^n$

到非法终点:走$n+m$步,向右占$m-1$就是$C_{n+m}^{m-1}$

答案就是:

$C_{n+m}^n-C_{n+m}^{m-1}(n \geq m)$

这里用向上也一样,只是答案化为:

$C_{n+m}^m-C_{n+m}^{n+1}(n \geq m)$

这不是公式$C_n^m=C_n^{n-m}$么(笑)

一番公式化简:($LaTex$练习)

$\begin{array}{lcl}C_{n+m}^n-C_{n+m}^{m-1} & = & \frac{(n+m)!}{n! \times m!}-\frac{(n+m)!}{(m-1)! \times (n+1)!}\\ & = & \frac{(n+m)! \times (n+1-m)}{(n+1)! \times m!}\\ & = & \frac{(n+m) \times \cdots \times (n+2) \times (n+1-m)}{m!}\end{array}$

用高精乘低精和高精除低精就可以了。

2>prufer序列

首先说一句:每一颗不同的无根树有且仅有唯一prufer序列与之对应。

且prufer序列与无根树可以互相转换。

转换顺序是规定好的。

树转序列

在无根树上,进行如下操作(提前建立一个数列$M$,叫数组也一样)

1.找到编号最小的度数为$1$的点

2.然后把这个点删掉(把它连的边也一起删掉),与它有边相连的点加入$M$

3.不断重复1.2.操作,直至树中只剩下两个点

我们的数列$M$就是prufer序列。

序列转树

(如果不能转树这个序列就几乎没用了)

首先定义集合$G=\{1,2,3,\cdots,n\}$

取prufer序列$M$进行如下操作:

1.取$M$中最靠前元素,与$G$中存在但不存在于$M$的点连边

2.删除$M$,$G$中连边的两个元素

3.重复以上操作,直至$G$中只剩两个点(然后这两个点连边就完了)

因为一一对应,所以无根树和prufer序列是数量一致的

那么就有:$n$个节点的无根树的个数为$n^{n-2}$

于是有根树的个数:$n^{n-1}$(随便选一个点做根)

枚举起来很方便的!

然后因为每次有边才能加入$M$,有式子:度数=$M$中出现次数+1

这样度数确定的点也可以枚举

有:

$\frac{(n-2)!}{(d_1-1)! \times (d_2-1)! \times \cdots \times (d_n-1)!}$

也许这个公式不好理解(但是好用啊啊):推导

首先要说的是原始公式:

$C_{n-2}^{d_1-1} \times C_{n-d_1+1-2}^{d_2-1} \times \cdots \times C_{n-d_1-\cdots-d_n+n-2}^{d_n-1}$

 就是说把$d_x-1$个点放入$n$个空里。

然后把剩下的放进剩下的空里(全排列)

花间(化简):

$\begin{array}{lcl} & = & \frac{(n-2)!}{(d_1-1)! \times (n-d_1+1-2)!} \times \frac{(n-d_1+1-2)!}{(d_2-1)! \times (n-d_1-d_2+2-2)!} \times \cdots \\ & = & \frac{(n-2)!}{(d_1-1)! \times (d_2-1)! \times \cdots \times (d_n-1)!}\end{array}$

3>线性基

这个就是求异或和的一个工具。

就是说,用原来一堆数异或出来的结果值域和用线性基一样。

其实这个不是这个时候讲的,但是我怕我忘了^_^

类比于向量的基底,这个是异或和的基底。

向量中有多维,每一维不互相影响。

二进制数有多位,在异或意义下不互相影响

用基底可以表示所有向量(平面/空间向量基本定理)(某G姓老师讲的很清楚)

可以这么说:虽然相互垂直的向量表示其它向量容易,但只要不共面就能表示空间向量,只要不共线就可以表示平面向量

类比的说,线性基是每一个二进制位上的基底,基底不一定是完全互相不影响的,而我们的目的是表示值域内所有数,并非更方便的表示一切数

这就解释了我们为什么用插入的方式更新基底而非直接用$0 \cdots 010 \cdots 0_{(2)}$这样的数做基底

下面是伪代码(解释一番)

for i=60 to 0                                首先要枚举二进制上的每一位,由高到低

    if(x的第i+1位为1)                     随后,找到二进制的最高位。我们找最高位

        {                                          是因为我们优先要考虑可以表示的最大的数而非更细致的数

              if(d[i]为0)                       如果没有可以表示的基底加进去。

               {  

                      d[i]=x;

                      break;

               }

               else x=x^d[i];                如果有基底,我们就用基底去表示它,这样如果表示了

        }                                           就不用加新的基底。

最后的 else 着重说一句。

异或是可逆的(暂且这么说)

$x\ xor\ y\ xor\ y = x$

所以我们用这个基底去拆插入的数。

这样就可以表示值域内的数。

这样我们怎么找最小的异或和?

直接把最小的有数基底输出。

如何找最大以及第$k$大呢?

这个只输出最大基底显然是错的,基底全异或也不对(不能保证异或和值单调)

那么我们就需要对基底进行处理。

我觉得就是用基底表示了基底。

把有数的基底$d_i$去处理别的基底$d_j(j > i)$

使其第$i$位为$0$,如果本来就是$0$就不用管它。

例:($X$表示未知,即$0$或$1$)

$\begin{array}{cc} \begin{array}{cc}0 & 1 & 0 & 1 & X & X & \cdots \\ 0 & 0 & 1 & 1& X & X & \cdots\\0 & 0 & 0 & 1 & X & X & \cdots\end{array}\\ \vdots \\ \Downarrow \\ \begin{array}{cc}0 & 1 & 0 & 0 & X & X & \cdots \\ 0 & 0 & 1 & 0 & X & X & \cdots \\ 0 & 0 & 0 & 1 & X & X & \cdots \end{array} \\ \vdots\end{array}$

这样就满足单调性了,最大值就可以求了。

 但是第$k$大怎么求啊??

可以利用状压思想。

把最后一位记为最低位。

$1$是异或$0$是不异或。

这样数越小就异或和就越小咯!

意思就是:

先把有数的基底堆在下面,处理完。

然后把最下面叫做最低位,最上面叫最高位。

这样,$00001$是最小的,$00010$第二小,$00011$第三小,以此类推。

 4>BSGS($\mathcal{Baby\ Step\ Giant\ Step}$)

适用于形如:

$A^x \equiv B (mod\ p)$

的式子求解$x$。

这里可以分情况求解。

1>p是质数

由费马小定理可知:$a^{p-1} \equiv 1 (\mbox{mod}\ p)$

这样$x$就一定小于$p-1$

设整数$m=\sqrt{p}$

这时,$x$就可以表示成:$i*m+j$

然后枚举$j$,可以用$\mathsf{hash}$表存一下

枚举$i$,在$\mathsf{hash}$表中寻找$B \times A^{-m \times i}(mod\ p)$,第一个就是解。

2>p不是质数

这是$EXBSGS$了,但还是说一下。

当$p$和$A$互质时,可以用欧拉定理,就是$A^{\phi(p)}\equiv 1(mod\ p)$

否则可以提$A$和$p$的公因数$d$,得到:

 $A^{x-1} \times \frac{A}{d}=\frac{B}{d}(mod\ \frac{p}{d})$

如果$B \% d \neq 0$,那么就无解了。

一直提公因数直至$A$互质$p$。

$A^{x-t} \times \frac{A^t}{\prod \limits_{i}^{t} d_i}=\frac{B}{\prod \limits_{i}^{t} d_i}(mod\ \frac{p}{\prod \limits_{i}^{t} d_i})$

 


 

可以留一个坑$\lfloor\rfloor$

转载于:https://www.cnblogs.com/kalginamiemeng/p/MathNote1.html

你可能感兴趣的:(数据结构与算法)