【总结】noip数学汇总

noip临近,有点怕需要数学知识定理才能做的题

快速幂

用途

O ( log ⁡ t ) O(\log t) O(logt)时间内求解 x t x^t xt

证明&过程

由于 x a ⋅ x b = x a + b x^a\cdot x^b=x^{a+b} xaxb=xa+b,而且每个自然数 t t t都可以拆分为不超过 log ⁡ 2 t \log_2t log2t个二次幂的和,即 t = ∑ i = 0 k i 2 i t=\sum_{i=0} k_i2^i t=i=0ki2i

x t = ∑ i = 0 x k i 2 i x^t=\sum_{i=0}x^{k_i2^i} xt=i=0xki2i

其中 k i k_i ki 0 / 1 0/1 0/1 x 2 i x^{2^i} x2i可以递推求得

代码
int qpow(int A,int B){
	int res(1);while(B){
		if(B&1)res=1ll*res*A%p;
		A=1ll*A*A%p,B>>=1;
	}return res;
}

一些定理

  • 威尔逊定理:对于任意质数 p p p,有 ( p − 1 ) ! ≡ p − 1 ( m o d p ) (p-1)!\equiv p-1\pmod p (p1)!p1(modp)
  • 费马小定理:对于任意质数 p p p,有 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1\pmod p ap11(modp)

扩展欧几里得

用途

求解形似 p ⋅ a + q ⋅ b = gcd ⁡ ( a , b ) p\cdot a+q\cdot b=\gcd(a,b) pa+qb=gcd(a,b) 方程的解

证明&过程

由于 gcd ⁡ ( a , b ) = gcd ⁡ ( b , a   m o d   b ) \gcd(a,b)=\gcd(b,a\bmod b) gcd(a,b)=gcd(b,amodb),则有

p ⋅ a + q ⋅ b = gcd ⁡ ( a , b ) = gcd ⁡ ( b , a   m o d   b ) = p ⋅ b + q ⋅ ( a − a b ⋅ b ) p\cdot a+q\cdot b=\gcd(a,b)=\gcd(b,a\bmod b)=p\cdot b+q\cdot (a-\frac ab\cdot b) pa+qb=gcd(a,b)=gcd(b,amodb)=pb+q(abab)

= q ⋅ a + ( p − a b ⋅ q ) ⋅ b =q\cdot a+(p-\frac ab\cdot q)\cdot b =qa+(pbaq)b

递归求解即可

代码
void exgcd(int a,int b,int&x,int&y){
	if(!b){x=1,y=0;return ;}
	exgcd(b,a%b,x,y);
	int tmp=x;x=y;y=tmp-a/b*y;
}

线性求逆元

用途

O ( n ) O(n) O(n)时间内求解区间 [ 1 , n ] [1,n] [1,n]中所有数的逆元

证明&过程

i i i 关于 p p p 的逆元

一般的对于 i = 1 i=1 i=1,有 i − 1 ≡ 1 ( m o d p ) i^{-1}\equiv 1\pmod p i11(modp)

对于 i > 1 i>1 i>1 的情况,设 p = k ⋅ i + r p=k\cdot i+r p=ki+r

放在模意义下, k ⋅ i + r ≡ 0 ( m o d p ) k\cdot i+r\equiv 0\pmod p ki+r0(modp)

同乘 r − 1 ⋅ i − 1 r^{-1}\cdot i^{-1} r1i1,得 k ⋅ r − 1 + i − 1 ≡ 0 ( m o d p ) k\cdot r^{-1}+i^{-1}\equiv 0\pmod p kr1+i10(modp)

由上面的定义式,有 k = ⌊ p i ⌋ , r = p   m o d   i k=\lfloor \cfrac pi\rfloor,r=p\bmod i k=ip,r=pmodi

则有 i − 1 ≡ − ⌊ p i ⌋ ⋅ ( p   m o d   i ) − 1 ( m o d p ) i^{-1}\equiv -\lfloor \cfrac pi\rfloor \cdot (p\bmod i)^{-1}\pmod p i1ip(pmodi)1(modp)

后面的 ( p   m o d   i ) − 1 (p\bmod i)^{-1} (pmodi)1可以通过调用前面的数组得到,前面的部分相当于转移系数

代码
inv[1]=1;
for(int i=2;i<=n;++i)
	inv[i]=1ll*(p-p/i)*inv[p%i]%p;

中国剩余定理

用途

求解同余方程组

{ x ≡ a 1 ( m o d p 1 ) x ≡ a i ( m o d p i ) x ≡ a n ( m o d p n ) \begin{cases} x\equiv a_1\pmod {p_1}\\ x\equiv a_i\pmod {p_i}\\ x\equiv a_n\pmod {p_n} \end{cases} xa1(modp1)xai(modpi)xan(modpn)

证明&过程

将式子拆开为多个形似下面的式子

{ x ≡ 0 ( m o d p 1 ) x ≡ a i ( m o d p i ) x ≡ 0 ( m o d p n ) \begin{cases} x\equiv 0\pmod {p_1}\\ x\equiv a_i\pmod {p_i}\\ x\equiv 0\pmod {p_n} \end{cases} x0(modp1)xai(modpi)x0(modpn)

则对于每个方程化为方程: k ⋅ ∏ j ̸ = i p j + r ⋅ p i = 1 k\cdot \prod_{j\not =i}p_j+r\cdot p_i=1 kj̸=ipj+rpi=1,最后再乘上 a i a_i ai

扩欧求解,解出第 i i i 个方程的解为 t i t_i ti ,则将答案合并得 A n s = ∑ t i ( m o d ∏ p i ) Ans=\sum t_i \pmod {\prod p_i} Ans=ti(modpi)

代码
void CRT(){
	read(n);
	int lcm=1;
	for(int i=1;i<=n;++i){
		read(a[i]),read(p[i]);
	    a[i]%=p[i];lcm*=p[i];
	}
	int x,y,ans=0;
	for(int i=1;i<=n;++i){
		int kl=lcm/p[i],t;
	    exgcd(kl,p[i],x,y);
	    t=1ll*x*kl*a[i]%p;
	    ans=(ans+t)%lcm;
	}
	printf("%d\n",ans);
}

斐波那契数列

递推公式

F i = F i − 1 + F i − 2 F_i=F_{i-1}+F_{i-2} Fi=Fi1+Fi2

通项公式

F i = 5 5 ⋅ [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] F_i=\frac {\sqrt 5}5\cdot \big[(\frac {1+\sqrt 5}2)^n-(\frac {1-\sqrt 5}2)^n\big] Fi=55 [(21+5 )n(215 )n](在这篇博客里有生成函数的推导)

性质
  • ∑ i = 1 n F i = F n + 2 − 1 \sum_{i=1}^nF_i=F_{n+2}-1 i=1nFi=Fn+21
  • ∑ i = 1 n F i 2 = F n ⋅ F n + 1 \sum_{i=1}^nF_i^2=F_n\cdot F_{n+1} i=1nFi2=FnFn+1
  • ∑ i = 1 n i ⋅ F i = n ⋅ F n + 2 − F n + 3 + 2 \sum_{i=1}^ni\cdot F_i=n\cdot F_{n+2}-F_{n+3}+2 i=1niFi=nFn+2Fn+3+2
  • ∑ i = 1 n F 2 i − 1 = F 2 n \sum_{i=1}^nF_{2i-1}=F_{2n} i=1nF2i1=F2n
  • ∑ i = 1 n F 2 i = F 2 n + 1 − 1 \sum_{i=1}^nF_{2i}=F_{2n+1}-1 i=1nF2i=F2n+11

卡特兰数

公式
  • f n = ∑ i = 0 n − 1 f i ⋅ f n − 1 − i f_n=\sum_{i=0}^{n-1}f_i\cdot f_{n-1-i} fn=i=0n1fifn1i
  • f n = f n − 1 ⋅ ( 4 n − 2 ) n + 1 f_n=\frac {f_{n-1}\cdot (4n-2)}{n+1} fn=n+1fn1(4n2)
  • f n = ( 2 n n ) n + 1 f_n=\frac {\binom {2n}n}{n+1} fn=n+1(n2n)
  • f n = ( 2 n n ) − ( 2 n n − 1 ) f_n=\binom {2n}n-\binom{2n}{n-1} fn=(n2n)(n12n)
模型
  • 括号序列计数
  • 二叉树形态计数
  • 凸多边形三角切分计数

欧拉函数&定理

欧拉函数

定义&性质

ϕ ( x ) \phi (x) ϕ(x)表示小于 x x x的正整数中,与 x x x互质的数的个数

x = ∏ p i k i x=\prod p_i^{k_i} x=piki,则 ϕ ( x ) = x ⋅ ∏ p i − 1 p i \phi (x)=x\cdot \prod \frac {p_i-1}{p_i} ϕ(x)=xpipi1

用途

在枚举 gcd ⁡ \gcd gcd时有奇效

线性筛

phi[1]=1;
for(rg int i=2;i<N;++i){
	if(!vis[i])phi[pri[++top]=i]=i-1;
    for(rg int j=1;j<=top&&i*pri[j]<N;++j){
    	vis[i*pri[j]]=1;
        if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}
        else phi[i*pri[j]]=phi[i]*(pri[j]-1);
    }
}
欧拉定理

定义

a , p a,p a,p互质(不要求为质数),则 a ϕ ( p ) ≡ 1 ( m o d p ) a^{\phi(p)}\equiv 1 \pmod p aϕ(p)1(modp)

用途

①一种求逆元的方法

②降幂:

由于 a ϕ ( p ) ≡ 1 ( m o d p ) a^{\phi(p)}\equiv 1\pmod p aϕ(p)1(modp)

a t ≡ a t a ϕ ( p ) ≡ a t &VeryThinSpace; m o d &VeryThinSpace; ϕ ( p ) ( m o d p ) a^t\equiv \frac {a^t}{a^{\phi (p)}}\equiv a^{t\bmod \phi(p)}\pmod p ataϕ(p)atatmodϕ(p)(modp)

错排

定义

n n n 个物品重新排列,求使得每个物品不在原来位置上的方案数,用 D n D_n Dn表示

D i = ( n − 1 ) ( D i − 1 + D i − 2 ) D_i=(n-1)(D_{i-1}+D_{i-2}) Di=(n1)(Di1+Di2)

伪の二维错排

考过一次,求二维平面中物品都不能在原来的行列上,直接计算 D n 2 D_n^2 Dn2即可

组合数学

定义式

( n m ) = n ! m ! ( n − m ) ! \binom nm=\frac {n!}{m!(n-m)!} (mn)=m!(nm)!n!

性质

( n m ) = ( n n − m ) \binom nm=\binom n{n-m} (mn)=(nmn)

( n m ) = ( n − 1 m − 1 ) + ( n − 1 m ) \binom nm=\binom{n-1}{m-1}+\binom{n-1}m (mn)=(m1n1)+(mn1)

m ( n m ) = n ( n − 1 m − 1 ) m\binom nm=n\binom{n-1}{m-1} m(mn)=n(m1n1)

∑ i = 0 r ( n + i i ) = ( n + r + 1 r ) \sum_{i=0}^r\binom {n+i}{i}=\binom {n+r+1}r i=0r(in+i)=(rn+r+1)

( n m ) ⋅ ( m d ) = ( n d ) ⋅ ( n − d m − d ) \binom nm\cdot \binom md=\binom nd\cdot \binom {n-d}{m-d} (mn)(dm)=(dn)(mdnd)

∑ i = 0 n ( − 1 ) i ( n i ) = 0 \sum_{i=0}^n(-1)^i\binom ni=0 i=0n(1)i(in)=0

∑ i = 0 n 2 ( n 2 i ) = 2 n − 1 \sum_{i=0}^{\frac n2}\binom n{2i}=2^{n-1} i=02n(2in)=2n1

∑ i = 0 n 2 ( n 2 i ) = 2 n − 1 \sum_{i=0}^{\frac n2}\binom n{2i}=2^{n-1} i=02n(2in)=2n1

∑ i = 0 n i ⋅ ( n i ) = n ⋅ 2 n − 1 \sum_{i=0}^ni\cdot \binom ni=n\cdot 2^{n-1} i=0ni(in)=n2n1

∑ i = 0 n i 2 ⋅ ( n i ) = ( n 2 + n ) ⋅ 2 n − 2 \sum_{i=0}^ni^2\cdot \binom ni=(n^2+n)\cdot 2^{n-2} i=0ni2(in)=(n2+n)2n2

∑ i = 0 n ( n i ) 2 = ( 2 n n ) \sum_{i=0}^n\binom ni^2=\binom {2n}n i=0n(in)2=(n2n)

1 ( n − i ) ! ( i − t ) ! = ( n − t n − i ) ⋅ 1 ( n − t ) ! \frac 1{(n-i)!(i-t)!}=\binom {n-t}{n-i}\cdot \frac 1{(n-t)!} (ni)!(it)!1=(nint)(nt)!1

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值