这是最后一篇即时笔记了呢

数学

数论

数论各种神器算法

线性递推逆元i1=(pp÷i)×(p%i)1%pi^{-1}=(p-\lfloor p\div i\rfloor)\times (p\%i)^{-1}\% p

以及阶乘和阶乘的逆元的递推:n!n×(n1)!(modp),(n!)1n1×((n1)!)1n!\equiv n\times (n-1)! \pmod{p},(n!)^{-1}\equiv n^{-1} \times ((n-1)!)^{-1}

可以用这个方法在O(n)\text{O}(n)预处理后,O(1)\text{O}(1)计算组合数。

线性筛

这个线性筛不仅可以筛质数,还可以计算积性函数。φ,μ\varphi,\mu等函数都可以用这种方法计算。详见贾志鹏 线性筛

随机数生成器

可以用矩阵,也可以用等比数列求和。

这里介绍一些等比数列求和的方法。

现在我们要求s=i=0nai=1+a+a2++an(modp)s=\sum_{i=0}^{n}a^i=1+a+a^2+\cdots+a^n \pmod{p}

如果pp是质数,我们就可以利用等比数列的求和公式s=an+11a1(an+11)×(a1)1(modp)s=\frac{a^{n+1}-1}{a-1}\equiv (a^{n+1}-1)\times (a-1)^{-1} \pmod{p}。时间复杂度O(logn)\text{O}(\log n)

如果pp不是质数,则答案可以如下计算:(an+11)%((a1)p)÷(a1)(a^{n+1}-1)\% ((a-1)p)\div (a-1)

上述方法可概括如下:若c=abc=\frac{a}{b}是整数,那么c%p=(a%(bp))÷bc\% p=(a\%(bp))\div b。(注意aa不能边算边模,aa一定要保持原样,即必须保证参与计算的bab\mid a。如果要涉及到更复杂的膜 蛤 模合数,请参见Virtual NOIP Day 2 总结。)

证明如下:设cx(modp),at(modbp)c\equiv x \pmod{p},a\equiv t \pmod{bp}

由同余的性质得,cx=np,at=bmpc-x=np,a-t=bmp

cc的定义带入得:abx=np\frac{a}{b}-x=np,知abx=bnpa-bx=bnp。得a=bnp+bxa=bnp+bx

又知a=bmp+ta=bmp+t,带入得bnp+bx=bmp+tbnp+bx=bmp+t,即bxt=bp(mn)bx-t=bp(m-n),知bxt(modbp)bx\equiv t \pmod{bp}

at=bmpa-t=bmpbct=bmpbc-t=bmp,得t=b(cmp)t=b(c-mp)。令k=cmpk=c-mp,则t=bkt=bk

带入得bxbk(modbp)bx\equiv bk \pmod{bp},约去bbxk(modp)x\equiv k\pmod{p}。证毕。

当然还可以用分治。现在要求s=i=0nai=1+a+a2++an(modp)s=\sum_{i=0}^{n}a^i=1+a+a^2+\cdots+a^n \pmod{p}

如果nn是偶数,设n=2kn=2k,那么s=1+a++ak+ak+1++a2k=(1+ak)(1++ak1)+a2ks=1+a+\cdots+a^k+a^{k+1}+\cdots+a^{2k}=(1+a^{k})(1+\cdots+a^{k-1})+a^{2k}

如果nn是奇数,设n=2k+1n=2k+1,那么

s=1+a++ak+ak+1++a2k+1=(1+ak+1)(1++ak)s=1+a+\cdots+a^k+a^{k+1}+\cdots+a^{2k+1}=(1+a^{k+1})(1+\cdots+a^k)

取边界条件k=0k=0,分治即可。

解方程

系数这么大,怎么办?写高精

写高精是不可能的,这辈子都不会写高精的!

我们考虑把方程弱化为同余方程,取一个大数~~(比如某个数)~~,最好是long long\text{long long}级别的,读入时直接把系数模pp,然后枚举解即可。

Freda城堡的密码

long long\text{long long}级别的Dark♂数,预处理出F1,F2,,F100000F_1,F_2,\cdots,F_{100000}模这个数的余数,枚举判断即可。

随机数生成的方法

最简单的方法当然是直接rand()(是否srand()都可以)。

下面介绍一种生成(几乎)不可预测的随机数的方法,对于OI\text{OI}赛制来说没有什么用,但是对于Codeforces\text{Codeforces}这种需要防hack\text{hack}的赛制,就很有用了。

1
2
3
4
void *a=new char;
void *b=(void *)(NULL);
int x=a-b;
delete a;

上述代码会生成一个随机数xx,请注意xx一定是88的倍数。

小凯的疑惑 遗憾

考场上怎么办?数论打表找规律!千万不要像我一样蠢到手算,面前摆的可是一台高科技计算机呢,怎么能不写程序找规律呢?找找规律就发现是一次函数了w_w。

证明我有时间再补吧。

看一道推广题:半质数的线性组合

结论是2pqrpqprqr2pqr-pq-pr-qr

欧拉函数($\varphi $函数)

φ(x)=i=1x[ix]\varphi(x)=\sum_{i=1}^{x}[i \perp x],即[1,x][1,x]中与xx互质的数的个数。

φ(ab)=φ(a)φ(b)  (ab)\varphi(ab)=\varphi(a)\varphi(b) \ \text{ }(a\perp b)

中国生育剩余定理

long long O(1)\text{long long} \text{ O}(1) 快速乘

有时候我们要计算a×b%pa\times b\% p,其中a,b,pa,b,p都是long long\text{long long}级别的数字,那么我们怎么办呢?

有一个玄学类型,叫做long double\text{long double},它作为浮点数类型,可以保存相当大的数,误差相对不是很大。

再回顾一下模的概念:x%p=axp×px\%p=a-\lfloor\frac{x}{p}\rfloor \times p

于是我们的思路就是,用long double\text{long double}暂时算出积的值并除以pp,加上一点微小的EPS\text{EPS},转换为long long\text{long long}后乘以pp,再用long long\text{long long}下积的值减去上面计算的结果,加上pp后再模pp即可。

上面说起来比较抽象,让我们看看代码。

1
2
3
4
5
6
7
8
9
10
11
ll mul(ll a,ll b,ll p){
ll res;
a%=p;
b%=p;
res=(ll)((long double)(a)*b/p+EPS);
res=res*p;
res=a*b-res;
res+=p;
res%=p;
return res;
}

压行后的代码如下:

1
2
3
4
ll mul(ll a,ll b,ll p){
a%=p,b%=p;
return (a*b-(ll)((long double)(a)*b/p+EPS)*p+p)%p;
}

注意这个方法在数字较大的时候很可能不准确,如果要保险,请使用龟速乘(O(logn)\text{O}(\log n))。

1
2
3
4
5
6
7
8
9
10
ll mul(ll a,ll b,ll p){
ll ans=0;
while (b){
if (b&1)
ans=(ans+a)%p;
a=(a<<1)%p;
b>>=1;
}
return ans;
}

组合数学

Catalan\text{Catalan}

可以用生成函数解(学长的方法),也可以用图形直接转化为组合数(米尔嘉的神奇方法)。

Cn=(2n)!(n+1)!n!C_{n}=\frac{(2n)!}{(n+1)!n!}可以表示:

  1. nn个结点的不同形态的二叉树的个数
  2. nn对括号的合法括号序列的个数
  3. 长度为nn的入栈序列对应的合法出栈序列个数
  4. 通过连接顶点而将n+2n+2边的凸多边形分成三角形的方法个数

根据Catalan\text{Catalan}数公式的推导过程,可以用Cn=Cn2nCn+12nC_{n}=\text{C}^{2n}_{n}-\text{C}^{2n}_{n+1}进行无除法的递推。

合法括号序列

将问题分解为,按键nn次输入一个长度为mm的序列和长度为mm的序列有多少个是合法括号序列。前者可以通过dp\text{dp}计算,而后者就是Catalan\text{Catalan}数,最后将这两个相乘再累加即得答案。

子集选取

注意到每个元素的选取是独立的。

考虑某一个元素的选取,将选取方案转化为三角形上的折线,因此答案为2nk2^{nk}

卢卡斯定理

应用:愚蠢的组合数

概率论

茶壶

最优策略一定是选当前剩下的最贵的壶。将壶的价格从小到大排序为a1,a2,,a2na_1,a_2,\cdots,a_{2n}。那么第ii个壶被选中的概率是pi=i12n1p_i=\frac{i-1}{2n-1},于是总期望E=i=12npiai\text{E}=\sum_{i=1}^{2n}p_{i}a_{i}

NOIP 2018\text{NOIP }2018初赛T8\text{T8}

结论:在[0,1][0,1]内找nn个数,其中最大数的期望是nn+1\frac{n}{n+1},最小数的期望是1n+1\frac{1}{n+1}

期望

  • 独立事件:若P(AB)=P(A)P(B)\text{P}(AB)=\text{P}(A)\text{P}(B),则AABB是独立的。

  • 期望的性质:线性性:Ex(aX+bY)=aEx(X)+bEx(Y)\text{Ex}(aX+bY)=a\text{Ex}(X)+b\text{Ex}(Y)
    独立随机变量的期望:若X,YX,Y独立,则Ex(XY)=Ex(X)Ex(Y)\text{Ex}(XY)=\text{Ex}(X)\text{Ex}(Y)

  • 条件概率。

评论