Icebound

icebound-area

NOIP数学整理

写在前面

数学如同一朵鲜花
华丽的外表下
带着我的梦想
向远方出发

可是道路并不好走
充满荆棘,路面泥泞
但是我不怕
因为我手中
有着世界上最奇妙的花

于是这就是我的NOIP数学整理了,自认为比较全面了

 

一 基本运算

略 需要注意的一点是负数取mod:a%c=(a%c+c)%c

二 一般算法

1 快速幂与ex快速幂

快速幂:略 可以递归写 复杂度logn

ex快速幂:

求(1+a+a2+…+ab) mod p (等比数列求和)

1<=a, b, p <= 10^9

先做1+a

再做(1+a)*a^2+(1+a) 这样就是1+a+a^2+a^3 再做(1+a+a^2+a^3)*a^4+.. 递归下去 记录当前乘了a的多少次方

这样做到接近于 b的地方:

1+a+a^2+……+a^(2^k) 此时再往回乘上之前记下来的系数 同时加上自己本身 你会惊奇的发现你算出了Σa^(i-1) 再乘个a加上自己即可

2 质数判断及筛法

质数判断:

1 暴力(sqrt(n))

2 多次判断:先筛出1-sqrt(n) 再判断

3 mr 大法好 时间复杂度log(n)

筛法:

1 未筛到的即为素数 打上标记并进入素数表

2 for 1->totp 枚举素数 保证每个数只被自己的最小素因子筛掉;

详细讲解:每个合数可以表示成p1*p2*p3*p4….的形式(指数我省略了) P数组中的素数是单调递增的,当找到第一个素因子时,就break了 绝壁是最小素因子!

这样可以保证严格单调O(N)的

3 质因数相关

神级定理:一个数最多只有一个大于sqrt(P)的质因子,且一个数的质因数非常少!-》NOI2015考啦!

分解质因数:

1 暴力分解 sqrt(n)

2 筛完了分解 要多快有多快

3 通吃-》pr算法

n!分解质因数:

筛出n以内所有素数,对于n! 可以分解为 p1^a1*p2^a2….这样的。

所以对于每个素数,每次某个素数的质数+=n/p[i],这样把1*2*3*4*…中所以p的倍数都算了,所以就可以出每个质数的指数了。

无须担心精度问题,下取整大法好。

4 约数相关

小提示:某个数的约数的数量也很少,基于约数的暴力【乱搞】也是合适的。

计算约数:

sqrt(n) ->在sqrt(n)以内有一个约数,必定在sqrt(n)以上有对应的一个约数,+=2即可

约数个数:

每个数可以写成标准分解形式:p1^a1*p2^a2….

由约数定义可知p1^a1的约数有:p1^0, p1^1, p1^2… ,共(a1+1)个,同理p2^a2的约数有(a2+1)个……

根据乘法原理:n的约数的个数就是(a1+1)(a2+1)(a3+1)….

约数个数和

求1-n的数的约数个数:

在1-n所有数中,枚举i。i可以成为i*1,i*2,i*3…的约数。发现对于每一个i,i*1,i*2,i*3…这些数最多出现floor(n/i)次,于是for一遍即可!

5 欧拉函数:

公式:phi(n)=n*(1-1/p1)*(1-1/p2)…

不理性的思考一下,n个数中,p1是不与n互质的。。占1/p1的比例,1-这些就是互质的!最后用n乘上(我在瞎说什么)

认真的证明:(我本来想【抄】证明,发现网上的都是基于欧拉函数是积性函数的性质的,比如http://www.cnblogs.com/yefeng1627/archive/2013/01/02/2842492.html 回头再看【娱乐】吧)

不过根据这个公式并不好算欧拉函数,我们可以根据这个公式推出:

phi(x)->

phi(x*p)=phi(x)*p [x p不互质]

phi(x*p)=phi(x)*p-1[x p互质]   ->  我都不会证明

也有:                           ↑

若(n%p==0 && (n/p)%p==0) 则有:phi(n)=phi(n/p)*p;

若(n%p==0 && (n/p)%p!=0) 则有:phi(n)=phi(n/p)*(p-1);

于是轻松算欧拉函数,还能筛欧拉函数。。

6 欧拉定理相关:

费马小定理,欧拉定理-》略

以上定理的条件是a,b互质(否则没有逆元)

于是可以同时除以GCD。

逆元是可以预处理的:

inv[P mod i]*(P mod i)=1 inv[p mod i]为逆元

inv[P mod i]*(P-P/i*i)=1

inv[P mod i]*i*(-P/i)=1

i*(P-P/i)*(inv[P mod i])=1 加粗的是逆元

一个重要性质 逆元是完全积性的!

【并没有卵用,直接筛就好啊!】

7 扩展欧几里得

用扩展欧几里得能做的 逆元也能做

ax+by=1 ->ax=1-by ->  ax=1 mod p ->乘逆元c 这个也能反过来

ax+by=gcd(a,b),若b=0,gcd(a,0)=a。原式变为ax+by==a -> x==1,y==0。

x,y表示第一次递归时的值,x1,y1表示第二次递归时的值。gcd(a,b)=gcd(b,a%b),同时都代入ax+by=gcd(a,b),出来ax+by=b*x1+(a%b)*y1。随便变形一下

b*x1+(a%b)*y1=

b*x1+(a-(a/b)*b)*y1=   -》这里记住 a%b=a-floor(a/b)*b

a*y1+b*(x1-(a/b)*y1)=

ax+by==a*y1+b*(x1-(a/b)*y1)

也就是说,上一深度的x等于下一深度的y1,上一深度的y等于下一深度的x1-(a/b)*y1。

代码很短 也很好写 做的事情却很多

8 中国剩余定理

已知p1, p2, p3…pr两两互质

求x使得

x = a1 (mod p1)

x = a2 (mod p2)

x = ar (mod pr)

这玩意跟暴力一样23333

如果有一个x%p1 =a1 %p2=0 %p3=0 …【全是0】

如果找道%p1=a1 的x1  %p2= a2的…把他们全加起来,就是结果。

具体实现:

解x1的时候,用exgcd解 x1*p2*p3*p4*…=a1 mod p1

解x2的时候,用exgcd解 x2*p1*p3*p4*…=a2 mod p2

……..同理

这样乘上其他的就能保证mod其他的时候是0啦!

9 组合数取mod

1 暴力mod (暴力逆元)

2 mod p^t 的 记下来不互质的 最后再搞

3 mod非素数 拆成好多素数 然后套用2

4 Lucas定理

C(n,m)->把m,n转成p进制数,则c(n,m)=c(n1,m1)*c(n2,m2)*c(n3,m3)……

组合数统计:给定n, x, p,求C[n][i]=x (mod p)的i的数量

p是1000左右的质数, n <= 10^18

发现n很大 将组合数拆成·

 c(n1,m1)*c(n2,m2)*c(n3,m3)……形式

则n已知 m未知 枚举m对n做背包

F[i][j]为前i个数 目前组合数mod p大小为j的数量

F[i][j]->f[i+1][j*c(ni,k)]

10 高斯消元取mod

交换两行 对能整除的部分进行相减 再交换两个 比较难懂

详见小Z的房间

11 离散模对数,原根,指标相关

离散对数:

给定x, z, P,求x^y = z (mod P) P是质数

a^x=b(mod n) => (a^m)^i*a^j=b(mod n) 由费马小定理 =>  a^j=b*v^i(mod n)  其中v为v=(a^m)^(p-1)

将a^j mod p存入hash(map)表

每次计算 b*v^i mod n,若计算过程中发现b*v^i mod n在hash 表中出现过,返回i*m+j

指数循环节:能使a^x=1 mod p 的x phi(p) 是一个指数循环节,但不一定是最小指数循环节

最小指数循环节即为指标-》一定为phi(p)的约数-》枚举phi(p)约数即可

指标恰好等于phi(p)的数,叫做原根,原根的幂可以遍历整个剩余系。

最小的原根为四次根号p级别 暴力枚举即可

有了原根就可以放心大胆取log啦!

给定y z p 求 x^y=z mod p:

找到p的原根g,两边同时对g取对数(g很小直接暴力取),变成y*logx=logz mod p-1 一定注意是p-1  然后exgcd搞一下

12 数论杂项

n=n所有的约数的欧拉函数之和=》解决gcd求和问题

还有奇葩的玩意我就不写了

13 组合与排列【DP与乱搞】

多重集排列:有N个元素 其中每个元素有ai个 则排列数为:N!/(a1!+a2!+a3!…)

容斥原理:总方案数好求,不满足A条件,不管B条件的方案数也好求,不满足B条件,不管A条件的方案数也好求,同时不满足AB条件的方案数也好求。则ans=总-不A-不B-不AB

其他类似,当有N个限制条件时,该式子有2^N项,注意时间复杂度。

此外还有数位统计?

14 概率相关

一个人抛硬币,抛到正面就睡觉,否则继续抛,求抛的次数的期望值:

设x为期望值

则x=(0*1/2+x*1/2)+1【抛到正面 直接睡觉,抛到反面,x次才能睡觉】一定要相信这个世界!

【题我就不说了 每个方程都比较鬼畜】

DAG随机游走-》直接dp

一般图随机游走-》有后效性-》高斯消元

没了吧!!!!比【我】较【会】重【了】要【的】的都说了吧!

应该会有好多错。。。问TZG好啦!