数学一本通

1.数论


1.1 整除

性质

a b b c a c 若 a|b 且 b|c 则a|c
a b a c x , y , a ( b x + c y ) a|b且a|c等价于对任意的整数x,y,有a|(b*x+c*y)
a b ( m a ) ( m b ) , m Z a|b等价于(m*a)|(m*b),m\in Z
a x + b y = 1 , a n , b n , a b n , x , y Z 若a*x+b*y=1,且a|n,b|n,则a*b|n,x,y\in Z

第四条性质的a * x+b * y=1这里等价于a,b互质
若a * x+b * y=1我们还可以证得a,y互质,b,x互质
具体操作跟gcd有关,此处不展开

例题Strongbox

对于这个题我们可以轻易的得到这么一个结论

若a为密码,则k*a%n也为密码,k为正整数

还有一个小结论
我们一定可以找到一组p和q使得
px-qn=gcd(x,n)
x为密码,n为模数
这个可以用gcd相关的东西得到,之后再看[贝祖定理]
上面的式子我们可以理解为
p*x%n=gcd(x,n)
则由第一个结论
gcd(x,n)也为密码


引用:
设x,y是两个密码,那么(px+qy)%n也是密码。②

ax+by=GCD(x,y)一定有解,所以ax+by≡GCD(x,y) (mod n)一定有解③

因为:ax+by ≡ ax+by+pnx+qnx (mod n)

即 : (a+pn)x+(b+qn)y ≡ ax+by (mod n) ④

由③④得:

(a+p*n)x+(b+qn)*y≡GCD(x,y)一定有解

由②得:((a+pn)x+(b+qn) )%n 一定是密码(a+pn相当于②里面的p),

④=>ax+by是密码 , 进而③=>GCD(x,y) 是密码。


那么我们对于密码集
设t为所有密码的gcd
由上一个结论可知t为密码
若有比t更小的密码,那么gcd(t,p)<=p即gcd(t,p)<t矛盾,即t为最小密码

实现去找最小的t即可

#include<bits/stdc++.h>
using namespace std;
const int maxk=250005;
int cnt=0;
long long a[maxk];
long long p[20000005];
bool flag[20000005];
long long gcd(long long a,long long b){
	return b?gcd(b,a%b):a;
}
int search(long long x){
	int l=0,r=cnt+1;
	while(l+1<r){
		int mid=l+((r-l)>>1);
		if(p[mid]>=x)
			r=mid;
		else
			l=mid;
	}
	return r;
}
int main()
{
	long long n,k;
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=k;i++)
		scanf("%lld",&a[i]);
	long long g=gcd(a[k],n); 
	for(int i=1;i<k;i++)
		a[i]=gcd(a[i],g);
	for(long long i=1;i<=sqrt(g);i++){
		if(g%i)continue;
		p[++cnt]=i;
		if(g/i==i)break;
		p[++cnt]=g/i;
	}
	sort(p+1,p+cnt+1);
	for(int i=1;i<k;i++)
		flag[search(a[i])]=1;
	for(int i=1;i<=cnt;i++){
		if(flag[i]){
			for(int j=1;j<i;j++){
				if(p[i]%p[j])continue;
				flag[j]=1;
			}
		}
	}
	for(int i=1;i<=cnt;i++){
		if(flag[i])continue;
		printf("%lld",n/p[i]);
		return 0;
	}
	return 0;
}

1.2 同余

同余不满足同除性

a b m o d    k a\equiv b\mod k
无法推出
a / p b / p m o d    k a/p\equiv b/p\mod k
至于为什么,假如p>a或b不就能锅吗

关于同余的其他性质基本可以和四则运算混在一起乱搞

1.3 最大公约数

辗转相除法求gcd
又名欧几里得算法

int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}

关于最小公倍数
lcm(x,y)=x*y/gcd(x,y)
就好了
感觉我最小公倍数怪没面子的

扩展欧几里得算法
顾名思义就是扩展了一下的欧几里得算法
可能扩展辗转相除法太难听了
裴蜀定理
存在ax+by=gcd(x,y)
然后扩欧就是用来求解一组(a,b)的
原理的话我们看看欧几里得算法

g c d ( a , b ) : gcd(a,b):
a = k 1 b + r 1 a=k1*b+r1
r 1 = a k 1 b r1=a-k1*b
g c d ( b , a m o d    b ) gcd(b,a\mod b)
b = k 2 a m o d    b + r 2 b=k2*a\mod b+r2
r 2 = b k 2 a m o d    b r2=b-k2*a\mod b

直到最后你会happy的发现最后的r值就是gcd(x,y)
我们愉快的把式子回代就得到一组ax+by=gcd(x,y)的解了

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

1.4 逆元

关于逆元
传送门
这里我们主要指乘法逆元
加法逆元有毛用啊
乘法逆元
a b 1 m o d    p a*b \equiv 1 \mod p
那么一个val值乘上一个a mod p
想要再除掉a,乘上b即可
qaq

费马小定理
qaq
a p 1 1 m o d    p a^{p-1} \equiv 1 \mod p
那么
在mod p意义下a的逆元为a^(p-2)

1.5 中国剩余定理

x k 1 m o d    r 1 x k 2 m o d    r 2 x k 3 m o d    r 3 x\equiv k1\mod r1\\ x\equiv k2\mod r2\\ x\equiv k3\mod r3
g=gcd(r1,r2,…,rn)
k 1 k 2 k 3 . . . k n m o d    g k1\equiv k2\equiv k3\equiv ...\equiv kn\mod g

1.6 斐波那契数

对于一个二项递推式
f i = a f i 1 + b f i 2 f_i=a*f_{i-1}+b*f_{i-2}
我们称
x 2 a x b = 0 x^2-a*x-b=0
为该式的特征方程
那么该式的通项公式则为
f i = r 1 x 1 i + r 2 x 2 i ( Δ > 0 ) f_i=r_1*x_1^i+r_2*x_2^i(若\Delta>0)
r1,r2的值有序列的某两项算出来

原理
f i = a f i 1 + b f i 2 θ 1 + θ 2 = a f i = ( θ 1 + θ 2 ) f i 1 + b f i 2 f i θ 1 f i 1 = θ 2 f i 1 + b f i 2 f i θ 1 f i 1 = θ 2 ( f i 1 + b θ 2 f i 2 ) θ 1 θ 2 = b f i θ 1 f i 1 = θ 2 ( f i 1 θ 1 f i 2 ) f i θ 1 f i 1 f i 1 θ 1 f i 2 = θ 2 f i θ 2 f i 1 f i 1 θ 2 f i 2 = θ 1 p i = f i θ 1 f i 1 , q i = f i θ 2 f i 1 p , q p i = θ 2 i 1 ( f 1 θ 1 f 0 ) q i = θ 1 i 1 ( f 1 θ 2 f 0 ) ( θ 2 θ 1 ) f i = θ 2 p i θ 1 q i f i = f 1 θ 1 f 0 θ 2 θ 1 θ 2 i f 1 θ 2 f 0 θ 2 θ 1 θ 1 i θ 1 + θ 2 = a θ 1 θ 2 = b θ 1 , θ 2 x 2 a x b = 0 f_i=af_{i-1}+bf_{i-2}\\ 设\theta_1+\theta_2=a\\ f_i=(\theta_1+\theta_2)f_{i-1}+bf_{i-2}\\ f_i-\theta_1f_{i-1}=\theta_2f_{i-1}+bf_{i-2}\\ f_i-\theta_1f_{i-1}=\theta_2(f_{i-1}+\frac{b}{\theta_2}f_{i-2})\\ 令\theta_1\theta_2=-b\\ 则\\ f_i-\theta_1f_{i-1}=\theta_2(f_{i-1}-\theta_1f_{i-2})\\ \frac{f_i-\theta_1f_{i-1}}{f_{i-1}-\theta_1f_{i-2}}=\theta_2\\ 同理\\ \frac{f_i-\theta_2f_{i-1}}{f_{i-1}-\theta_2f_{i-2}}=\theta_1\\ 设p_i=f_i-\theta_1f_{i-1},q_i=f_i-\theta_2f_{i-1}\\ 则p,q为等比数列\\ p_i=\theta_2^{i-1}(f_1-\theta_1f_0)\\ q_i=\theta_1^{i-1}(f_1-\theta_2f_0)\\ (\theta_2-\theta_1)f_i=\theta_2p_i-\theta_1q_i\\ f_i=\frac{f_1-\theta_1f_0}{\theta_2-\theta_1}\theta_2^i-\frac{f_1-\theta_2f_0}{\theta_2-\theta_1}\theta_1^i\\ 由韦达定理\\ \theta_1+\theta_2=a\\ \theta_1\theta_2=-b\\ 则\theta_1,\theta_2为方程\\ x^2-ax-b=0的两根


除了通项公式
我们还可以用矩阵快速幂来解决这个问题
对于最简单的斐波那契来说
f i = f i 1 + f i 2 [ 1 1 1 0 ] × [ f i 1 f i 2 ] = [ f i f i 1 ] f_i=f_{i-1}+f_{i-2}\\ --------\\ \left[ \begin{matrix} 1&1\\1&0\end{matrix} \right]\times\left[ \begin{matrix} f_{i-1}\\f_{i-2}\end{matrix} \right]=\left[ \begin{matrix} f_i\\f_{i-1}\end{matrix} \right]
矩阵乘法

matrix operator *(matrix p)const{
	matrix ans;
	ans.clear();
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			for(int k=0;k<n;k++)
				ans.x[i][j]=(ans.x[i][j]+x[i][j]*p.x[i][j]%mod)%mod;
	return ans;
}

配出系数矩阵跑个快速幂
一个log就跑出来了

1.7 卡特兰数

卡特兰数的前几项为
1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900
f ( n ) = C 2 n n n + 1 f ( n ) = C 2 n n C 2 n n 1 f ( n ) = i = 0 n 1 f ( i ) × f ( n i 1 ) f ( n ) = f ( n 1 ) × ( 4 n 2 ) n + 1 f(n)= \frac {C^n_{2n}}{n+1}\\ f(n)=C_{2n}^n-C_{2n}^{n-1}\\ f(n)=\sum_{i=0}^{n-1}f(i) \times f(n-i-1)\\ f(n)=\frac{f(n-1)\times(4n-2)}{n+1}
经典模型:
1.二叉树计数问题
已知一颗二叉树有n个节点,问有多少种不同的形态
设f(x)表示有x个节点的二叉树有多少种不同的形态
设i表示左子树节点数量
f ( n ) = i = 0 n 1 f ( i ) × f ( n i 1 ) f(n)=\sum_{i=0}^{n-1}f(i) \times f(n-i-1)
Catalan数
2.AB排列问题
n个A与n个B排成一排,从前1个位置到前2n个位置B的个数不能少于A的个数
问排列总方案
3.多边形分割问题
给定一个凸n边形
问有多少种方法使n边形被n-3条不相交的对角线分割成n-3个三角形

1.8 素数

1.素数的判定

暴力筛

bool check(n){
	for(int i=2;i<=sqrt(x);i++)
		if(x%i==0)return 0;
	return 1;
}

埃氏筛

for(int i=1;i<=n;i++){
	if(vis[i])continue;
	prime[++cnt]=i;
	for(int j=i*i;j<=n;j+=i)
		vis[j]=1;
}

欧拉筛

for(int i=2;i<=n;i++){
	if(!isNotprime[i])
		prime[++cnt]=i;
	for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
		isNotprime[i*prime[j]];
		if(!(i%prime[j]))break;
	}
}
2.素数相关定理
  • 唯一分解定理
    任意一个数一定能被唯一分解为若干质数的乘积
  • 威尔逊定理
    若p为质数 (p-1)!+1为p的倍数
    ( p 1 ) 1 m o d    p (p-1)\equiv -1 \mod p
  • 费马定理
    若p为质数,a为正整数,且a,p互质,则
    a p 1 1 m o d    p a^{p-1}\equiv 1 \mod p

Miller-Rabin质数测试

通过费马定理
测试p是否为质数
随机k个a
代入a^(p-1)测试是否模p余1
由于p为素数时测试一定通过
而测试一个a,一个合数p通过的几率为1/4
那么我们做5次测试时概率为1/1024
做10次概率为1/1048576


2.群论


qaq


3.组合数学


3.1 计数原理

抽屉原理
加法原理
乘法原理
容斥原理

DeMorgan定理:
A B = A B A B = A B \overline{A\cup B}=\overline{A} \cap \overline{B}\\ \overline{A\cap B}=\overline{A} \cup \overline{B}

3.4 排列

错排
A = [ a 1 , a 2 , a 3 , . . , a n ] i [ 1 , n ] P p i ! = a i A=[{a_1,a_2,a_3,..,a_n}]\\ 对于任意i \in [1,n]\\ 排列P满足p_i != a_i
一般用D表示错排数
D = n ! × ( 1 1 1 ! + 1 2 ! 1 3 ! . . ( 1 ) n × 1 n ! ) D=n! \times (1-\frac{1}{1!}+\frac{1}{2!}-\frac{1}{3!}..(-1)^n\times\frac{1}{n!})
证明:
S 1   n A i 1   n i i A i = ( n 1 ) ! D = A 1 A 2 A 3 . . . A n D e M o r g a n D = A 1 A 2 A 3 . . . A n S = A 1 A 2 A 3 . . . A n D = n ! C n 1 × ( n 1 ) ! + C n 2 × ( n 2 ) ! . . . ( 1 ) n × C n n × 0 ! 设S为1~n的全排列集合\\ 设A_i为1~n的所有排列中第i个位置为i的所有排列的集合\\ 那么易得|A_i|=(n-1)!\\ D=|\overline {A_1} \cap \overline {A_2} \cap \overline {A_3} \cap...\cap \overline {A_n}|\\ 由DeMorgan定理 D=|\overline{A_1 \cup A_2 \cup A_3 \cup...\cup A_n}|\\ 又S=A_1 \cup A_2 \cup A_3 \cup...\cup A_n\\ 则D=n!-C_n^1 \times (n-1)!+C_n^2\times (n-2)!-...(-1)^n\times C_n^n\times 0!

3.5 组合

C n m = n ! m ! × ( n m ) ! / / C n m = C n n m / / n m n n m C n m = C n 1 m + C n 1 m 1 / / C n 0 + C n 1 + . . . + C n n = 2 n / / , n C_n^m=\frac{n!}{m!\times(n-m)!}//定义\\ C_n^m=C_n^{n-m}//n个里面选m个等于n个里面不选n-m个\\ C_n^m=C_{n-1}^m+C_{n-1}^{m-1}//杨辉三角,也可以用定义证明\\ C_n^0+C_n^1+...+C_n^n=2^n//二项式定理,看成n位的二进制数可证

发布了28 篇原创文章 · 获赞 8 · 访问量 594

猜你喜欢

转载自blog.csdn.net/zty_ju/article/details/102673225