【学习笔记】2021.10.5 - 清北学堂数论讲解

ExGcd

gcd

辗转相除法,即\(\gcd(a,b)=\gcd(b,a \mod b)\)。

lcm

\(lcm(a,b)=\frac{a \times b}{\gcd(a,b)}\)。

ExCrt

Excrt求解核心(合并方程)

大数翻倍法

void merge(int a1,int p1,int a2,int p2){
//x%p1=a1
//x%p2=a2
//x%p=a
	if(p1<p2) swap(a1,a2),swap(p1,p2);
//最坏复杂度是未翻倍的数,以上操作使得复杂度变为min(p1,p2) 
	int x=a1;
	while(x%p2!=a2) x+=p1;
//在方程一中,x对p1取模,所以加一点p1也无所谓,可以一只加p1直到它满足p2为止 
	return x%lcm(p1,p2); 
}
//卡掉以上代码:当且仅当只有两个1e9以上的大质数

计算取模(组合数)

n,m\(\leq\)2000,p不限

暴力。

n\(\leq 10^9\),m\(\leq 10^3\),p=\(10^9+7\)

逆元。

n\(\leq 10^9\),m\(\leq 10^3\),p=任意数

对于两个阶乘,暴力枚举并约分,然后计算所有数的积。

n,m\(\leq 10^9\),p\(\leq\)100

使用卢卡斯定理,将n和m拆分成p进制,使得逆元得以产生,拆分后低位对齐,高位补零,然后对于每一位进行对应地运算。

容斥原理

给定若干集合的大小及若干集合交的大小,求若干集合并的大小。

显然,\(S_1 \bigcup S_2 = S_1+S_2-S_1 \bigcap S_2\) ,容斥原理的核心思想正是如此。

公式:\(\bigcup\limits_{1\le i\le n} S_i=\sum\limits_{S\in\left\{S_1,S_2,\cdots,S_n\right\}}{(-1)}^{\left|S\right|+1}\left|\bigcap\limits_{S_i\in S}S_i\right|\)

例1.n夫妻问题

现有n对夫妻做成一圈,对于每个方案(旋转后相同认为是同一方案),要求没有任意一对夫妻相邻。

n对夫妻随便坐

圆排列,方案为\((2n-1)!\)。

处理

强制把一对夫妻绑在一起,此时这两个人可以视为一个单位,那么这些单位随便坐的方案为\((2n-1)!\)。

所以,拎出一对夫妻绑在一起再随便坐的方案为 \(C^m_n \times (2n-1)! \times 2^1\)。

但是,两对夫妻绑在一起的会被减去两次,要加回来。

然后,三对的会多加一次,要减回去。

四次加回来,五次减回去……

然后就是容斥,最终公式为 \(\sum\limits^n_{i=0}{C^m_n \times (2n-1-i)! \times 2^i \times (-1)^i}\)。

例2.FoxJumping

给定一个大小为\(n \times m\)的矩阵,要你从\((0,0)\)走R步到\((n,m)\),每次可以从\((x,y)\)走到\((x+d_x,y+d_y)\),要求 \(0 \leq d_x \leq T_x\),\(0 \leq d_y \leq T_y\),\(d_x+d_y \neq 0\) 且 \(\forall 1 \leq i \leq k,(d_{x_i},d_{y_i}) \neq (10 \times z_i,10 \times z_i) \),\(n,m \leq 800\)。

设\(f[R][N]\)表示走R步x轴走到n的方案,\(g[R][M]\)表示走R步y走到m的方案(不考虑是否合法),最终总方案就是\(f[R][N] \times g[R][M]\)。

接下来考虑只走不合法步骤的路径,设 \(h[i][z]\) 表示只走i步不合法,走到 \( (10 \times z_i,10 \times z_i) \) 的方案数。

所以总不合法的方案数为\(\sum\limits^k_{i=0}{(-1)^i \sum\limits^{\frac{min(n,m)}{10}}_{z=0}{h[i][z]}\times f[k-i][N-10z]\times g[k-i][M-10z]}\)。(i步不合法到某个\(z_i\)的位置的方案乘上剩下的步数的合法的方案)

我是伞兵,笔记不全,这里是Minus神仙的笔记以供补充

posted @ 2021-10-05 18:50  Binaries  阅读(136)  评论(5编辑  收藏  举报
浏览器标题切换
浏览器标题切换end