数学部分摘要

主要内容:1.素数 2.同余 3.组合数学 4.矩阵乘法

1.素数

试除法

试除法可以对任意位置的正整数进行查询,除了试除法以外,还有其他的优秀的算法也可以对单个数进行判定,如 Miller_Rabin
试除法在单个查询时,可以以 \(O(\sqrt{n})\) 的时间内判定一个数是否是质数,一般而言,试除法已经能够满足大部分题目对于质数查找的需求

质数筛

问题:给定一个整数 N ,求出 1~N 之间的所有质数,称为质数筛

1.Eratosthenes筛法(埃氏筛)

该算法基于一个思想:对于一个数 x ,它的所有倍数 \(2x , 3x , …… , dx\) , 均为合数,显然,该命题成立
由此,埃氏筛对所有未被标记过的数进行筛选,经它的所有倍数筛去,剩余的数即为素数
但是, 2 和 3 均为质数,未被标记,它的倍数 6 会被标记多次,对复杂度有一定的影响,\(O(N\log{\log{N}})\)

2.线性筛
线性筛通过“从大到小积累质因子”的方法标记每一个合数,这样,对于一个合数,就可以避免过多的冗余运算

int v[maxn],prime[maxn];
void primes(int n)
{
	memset(v,0,sizeof(v));//最小质因子
	m=0;//质数个数
	for(int i=2;i<=n;i++)
	{
		if(!v[i])//未被标记,i为质数
		{
			v[i]=i;
			prime[++m]=i;
		}
		for(int j=1;j<=m;j++)
		{
			if(prime[j]>v[i]||prime[j]>n/i) break;//i有更小的质因子,或者超出n的范围
			v[i*prime[j]]=prime[j];//prime[j]为合数 i*prime[j]的最小质因子
		}
	}
}

欧拉函数

  • 定义:欧拉函数 \(\varphi(n)\) 表示在小于 n 的数中,与 n 互质的数的个数
  • 计算公式:\(\varphi(n)\) = \(n \times \prod_{i=1}^{k}{(1-\frac{1}{p_i})}\)
  • 性质:欧拉函数为积性函数(积性函数定义:若任意的两个互质的正整数满足\(f(xy)=f(x)\times f(y)\),则称函数 \(f(x)\) 为积性函数)
  • 性质:\(\sum_{d|n}{\varphi(d)} = n\)

2.同余

定义 & 定理

  • 定义:若整数 a , b 除以正整数 m 的余数相等,则称 a , b 模 m 同余,记为:\(a \equiv b (\bmod m)\)
  • 定义:乘法逆元:若整数 b , m 互质,则必然存在 \(a\times b \equiv 1 (\bmod m)\) ,则称 a 为 b 的乘法逆元
  • 费马小定理:若 p 为质数 , 则对于任意整数 a , 有 \(a^p \equiv a (\bmod p)\)
  • 欧拉定理: 若正整数 a , n 互质,则 \(a^{\varphi(n)} \equiv 1 (\bmod n)\)

扩展欧几里得算法(exgcd)

  • 贝祖定理:对于任意的整数 a,b,存在一对整数 x,y,满足 \(ax+by = gcd(a,b)\)
    利用贝祖定理,即可得到上式中整数 x,y 的计算方法,称为扩展欧几里得算法
int exgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1,y=0;
		return a;
	}
	int d=exgcd(b,a&b,x,y);//利用扩展欧几里得算法,可顺便求得 a 与 b 的最大公约数
	int z=x;
	x=y;
	y=z-(a/b)*y;
	return d;
}

利用扩展欧几里得算法,即可求得不定方程 \(ax + by = gcd(a,b)\) 的一组特解,则其通解可表示为:\(x = \frac{c}{d}x_0 + k\frac{b}{d}\)\(y = \frac{c}{d}y_0 - k\frac{a}{d}\)

中国剩余定理(crt)

  • \(m_1 , m_2 , …… , m_n\) 为两两互质的正整数,\(m = \prod_{i=1}^{n}{m_i}\)\(M_i = m/m_i\)\(t_i\) 是线性同余方程 \(M_i t_i \equiv 1 (\bmod m_i)\) 的一个解,
    则对于任意的 n 个整数 \(a_1 , a_2 , …… , a_n\) , 方程组:

    有整数解,解为: \(x = \sum_{i=1}^{n}{a_iM_it_i}\)
    证明略

3.组合数学

组合数学向来是数学上的一大难点,但是应用性极强,可以帮助解决许多复杂的问题,与容斥原理配合食用效果更佳 (建议百度搜索:小葱同学

加法原理

  • 若完成一件事的方法有 n 类,其中第 i 类方法包括 \(a_i\) 种不同的方法,且这些方法互不重合,则完成这件事共有:\(a_1+a_2+a_3+……+a_n\) 种方法

乘法原理

  • 若完成一件事的需要有 n 步,其中完成第 i 步包含 \(a_i\) 种不同的方法,且这些步骤互不干扰,则完成这件事共有:\(a_1\times a_2\times a_3 \times …… \times a_n\) 种方法

排列数

  • 从 n 个不同元素中依次取出 m 个元素排成一列,产生的不同排列的数量为:\(A_n^m = \frac{n!}{(n-m)!}\)

组合数

  • 从 n 个不同元素中取出 m 个元素组成一个集合,产生的不同集合的数量为:\(C_n^m = \frac{n!}{(n-m)!(m)!}\)

性质

1.\(C_n^m = C_n^{n-m}\)

2.\(C_n^m = C_{n-1}^m + C_{n-1}^{m-1}\)

3.\(C_n^0 + C_n^1 + C_n^2 + …… + C_n^n = 2^n\)

4.\((a+b)^n = \sum_{k=0}^{n}{C_{n}^{k}{a^k}{b^{n-k}}}\) (二项式定理)

Lucas 定理

公式:\(C_n^m \equiv C_{n \ mod \ p}^{m \ mod \ p} * C_{n/p}^{m/p} \ (\bmod p)\)
(证明略)

posted @ 2020-07-13 17:01  雾隐  阅读(227)  评论(4编辑  收藏  举报