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} xa⋅xb=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 (p−1)!≡p−1(modp)
- 费马小定理:对于任意质数 p p p,有 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1\pmod p ap−1≡1(modp)
扩展欧几里得
用途
求解形似 p ⋅ a + q ⋅ b = gcd ( a , b ) p\cdot a+q\cdot b=\gcd(a,b) p⋅a+q⋅b=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) p⋅a+q⋅b=gcd(a,b)=gcd(b,amodb)=p⋅b+q⋅(a−ba⋅b)
= q ⋅ a + ( p − a b ⋅ q ) ⋅ b =q\cdot a+(p-\frac ab\cdot q)\cdot b =q⋅a+(p−ba⋅q)⋅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 i−1≡1(modp)
对于 i > 1 i>1 i>1 的情况,设 p = k ⋅ i + r p=k\cdot i+r p=k⋅i+r
放在模意义下, k ⋅ i + r ≡ 0 ( m o d p ) k\cdot i+r\equiv 0\pmod p k⋅i+r≡0(modp)
同乘 r − 1 ⋅ i − 1 r^{-1}\cdot i^{-1} r−1⋅i−1,得 k ⋅ r − 1 + i − 1 ≡ 0 ( m o d p ) k\cdot r^{-1}+i^{-1}\equiv 0\pmod p k⋅r−1+i−1≡0(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 i−1≡−⌊ip⌋⋅(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} ⎩⎪⎨⎪⎧x≡a1(modp1)x≡ai(modpi)x≡an(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} ⎩⎪⎨⎪⎧x≡0(modp1)x≡ai(modpi)x≡0(modpn)
则对于每个方程化为方程: k ⋅ ∏ j ̸ = i p j + r ⋅ p i = 1 k\cdot \prod_{j\not =i}p_j+r\cdot p_i=1 k⋅∏j̸=ipj+r⋅pi=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(mod∏pi)
代码
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=Fi−1+Fi−2
通项公式
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−(21−5)n](在这篇博客里有生成函数的推导)
性质
- ∑ i = 1 n F i = F n + 2 − 1 \sum_{i=1}^nF_i=F_{n+2}-1 ∑i=1nFi=Fn+2−1
- ∑ 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=Fn⋅Fn+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=1ni⋅Fi=n⋅Fn+2−Fn+3+2
- ∑ i = 1 n F 2 i − 1 = F 2 n \sum_{i=1}^nF_{2i-1}=F_{2n} ∑i=1nF2i−1=F2n
- ∑ i = 1 n F 2 i = F 2 n + 1 − 1 \sum_{i=1}^nF_{2i}=F_{2n+1}-1 ∑i=1nF2i=F2n+1−1
卡特兰数
公式
- 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=0n−1fi⋅fn−1−i
- f n = f n − 1 ⋅ ( 4 n − 2 ) n + 1 f_n=\frac {f_{n-1}\cdot (4n-2)}{n+1} fn=n+1fn−1⋅(4n−2)
- 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)−(n−12n)
模型
- 括号序列计数
- 二叉树形态计数
- 凸多边形三角切分计数
欧拉函数&定理
欧拉函数
定义&性质
ϕ ( 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)=x⋅∏pipi−1
用途
在枚举 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   m o d   ϕ ( p ) ( m o d p ) a^t\equiv \frac {a^t}{a^{\phi (p)}}\equiv a^{t\bmod \phi(p)}\pmod p at≡aϕ(p)at≡atmodϕ(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=(n−1)(Di−1+Di−2)
伪の二维错排
考过一次,求二维平面中物品都不能在原来的行列上,直接计算 D n 2 D_n^2 Dn2即可
组合数学
定义式
( n m ) = n ! m ! ( n − m ) ! \binom nm=\frac {n!}{m!(n-m)!} (mn)=m!(n−m)!n!
性质
( n m ) = ( n n − m ) \binom nm=\binom n{n-m} (mn)=(n−mn)
( n m ) = ( n − 1 m − 1 ) + ( n − 1 m ) \binom nm=\binom{n-1}{m-1}+\binom{n-1}m (mn)=(m−1n−1)+(mn−1)
m ( n m ) = n ( n − 1 m − 1 ) m\binom nm=n\binom{n-1}{m-1} m(mn)=n(m−1n−1)
∑ i = 0 r ( n + i i ) = ( n + r + 1 r ) \sum_{i=0}^r\binom {n+i}{i}=\binom {n+r+1}r i=0∑r(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)⋅(m−dn−d)
∑ i = 0 n ( − 1 ) i ( n i ) = 0 \sum_{i=0}^n(-1)^i\binom ni=0 i=0∑n(−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=0∑2n(2in)=2n−1
∑ i = 0 n 2 ( n 2 i ) = 2 n − 1 \sum_{i=0}^{\frac n2}\binom n{2i}=2^{n-1} i=0∑2n(2in)=2n−1
∑ i = 0 n i ⋅ ( n i ) = n ⋅ 2 n − 1 \sum_{i=0}^ni\cdot \binom ni=n\cdot 2^{n-1} i=0∑ni⋅(in)=n⋅2n−1
∑ 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=0∑ni2⋅(in)=(n2+n)⋅2n−2
∑ i = 0 n ( n i ) 2 = ( 2 n n ) \sum_{i=0}^n\binom ni^2=\binom {2n}n i=0∑n(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)!} (n−i)!(i−t)!1=(n−in−t)⋅(n−t)!1