【集训】ZR集训——数学
7.29
数论
CRT板子
//x=a(mod m)
Int A=0,M=1;
for(int i=1;i<=n;i++){
Int x,y;
Int k=exgcd(M,m[i],x,y);
if((A-a[i])%k!=0) return -1;
x*=(A-a[i])/k;
A-=x*M;
M=M/k*m[i];
A=(A%M+M)%M;
}
int ans=(A%M+M)%M;
return ans;
//kx=a(mod m)对此方程一次求解
//kx+my=a
//g=gcd(k,m)
//x=a/g*x'+m/g*t即x=a/g*x'(mod m/g)
//按照第一种情况求解
exgcd证法
线性求逆元组
龟速乘(会不会是快速加[doge]
BSGS
//a^x=b(mod p)
//t=sqrt(p)
//x=i*t-j
//a^(i*t)=b*a^j(mod p)
//(a^t)^i=b*a^j(mod p)
//0<=j<t
int B=sqrtl(p)+1;
unordered_map<int,int> mp;
int pw=1;
for(int i=1;i<=B;i++){
mp[(b*=a)%=p]=i;
(pw*=a)%=p;
}
int k=1;
for(int i=1;i<=B;i++){
if(mp.count((k*=pw)%=p)) return i*B-mp[k];
}
return -1;
矩阵
矩阵求逆
模意义高斯消元
线性基
定理:假设 \(n\) 个数的线性基中有 \(k\) 个数,那么显然共有 \(2^k\) 个不同的异或和,而其中每一个异或和的出现次数都是 \(2^{n−k}\)
前缀线性基(时间戳线性基):维护时间点,靠后优先
差分线性基:区间修改转单点修改
可删除线性基:1.线段树分治 2.维护时间点
k进制线性基
ex
仙人掌图
LGV引理:对偶容斥,行列式加速
矩阵树定理
7.30
dp套dp
狄利克雷前缀和
莫比乌斯反演
莫比乌斯函数是常数函数的逆元,即 \(\mu*1=e\)
与狄利克雷前缀和互为逆运算,一个是前缀和,一个是差分
杜教筛(❌️)
min25筛(❌️)
7.31
容斥
min-max容斥
容斥的几种形式
AB统称多步容斥
形式A:经典容斥
求并集或者并集补集
并集由交集表示,也可以被认为一个性质都不满足的方案数
其核心是二项式定理的应用,也可以理解成广义容斥的特殊形式
形式B:广义容斥
求“恰好满足t个性质”
其推导的式子和二项式反演极其相似,诠释了容斥与二项式之间的紧密联系
形式C:对偶容斥
名字是我瞎起的,这类容斥和上面两类容斥没什么关系
其应用于LGV引理的证明中,有一组不合法路径,其方案数相同,我们设计容斥系数使之相互抵消
合法路径不与任何其他路径成对偶
还有一个应用是 min-max容斥(其实我也不太确定)
EX
二项式反演
不定方程非负整数解计数(有上界容斥)
树上容斥dp(加速容斥):P12639
prufer序列
公式
Cayley 公式:有标号⽆根树的数量为 \(n^{n-2}\) ,有标号有根树的数量为 \(n^{n-1}\)
洛⾕P2290 [HNOI2004] 树的计数:指定度数序列为 \(d_1,d_2,d_3..,d_n\) 的⽆根树数量是 \(n-2 \choose {d_1-1,d_2-1,...,d_n-1}\)
图联通方案:⼀张有 \(k\) 个连通块的图,第 \(i\) 个连通块⼤⼩为 \(a_i\) ,求连接 \(k-1\) 条边使得图连通的⽅案数为 \((\sum a_i^{k-2})\Pi a_i\)。(数学推导)
扩展 Cayley 公式:\(n\) 个有标号结点形成 \(s\) 棵树的森林且 \(1,2,...,s\) 不属于同⼀棵树的⽅案数为 \(sn^{n-s-1}\) 。
树与序的双射构建
P6086
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6+10;
int f[N];
int p[N];
int n;
int d[N];
void solve1(){
for(int i=1;i<=n-1;i++){
cin>>f[i];
d[f[i]]++;
}
for(int i=1,j=1;i<=n-2;i++,j++){
while(d[j]) j++;p[i]=f[j];
while(i<=n-2&&!(--d[p[i]])&&p[i]<j) p[i+1]=f[p[i]],i++;
}
int ans=0;
for(int i=1;i<=n-2;i++) ans^=i*p[i];
cout<<ans<<"\n";
}
void solve2(){
for(int i=1;i<=n-2;i++){
cin>>p[i];
d[p[i]]++;
}p[n-1]=n;
for(int i=1,j=1;i<n;i++,j++){
while(d[j]) j++;f[j]=p[i];
while(i<n&&!(--d[p[i]])&&p[i]<j) f[p[i]]=p[i+1],i++;
}
int ans=0;
for(int i=1;i<n;i++) ans^=i*f[i];
cout<<ans<<"\n";
}
signed main(){
int m;cin>>n>>m;
if(m==1) solve1();
else solve2();
return 0;
}
//指针维护最小值
矩阵树定理
无向
定义⼀张⽆向图 的 Laplace 矩阵 \(L_G\) 为度数矩阵减去邻接矩阵,那么其⽣成树个数为任意选取⼀个 \(i\),\(L_G\) 去除第 \(i\) ⾏ \(i\) 列后矩阵的⾏列式。
有向拓展
假设现在给定一个图G.
度数矩阵D:若存在边 \((x,y,z)\) ,则 外向树中 \(D[y][y]+=z\); 内向树中 \(D[x][x]+=z\);
邻接矩阵C:若存在边 \((x,y,z)\) ,则 内向树和外向树中均为 \(C[x][y]+=z\);
图G的基尔霍夫矩阵 \(A = D − C\) 。
加权拓展
那么矩阵树定理求的就是边权乘积之和,此时点的度数为连边权值和
LGV引理
8.1
期望
线性性
无关不是互斥
做题思想
由于期望dp是倒着做的,所以可能记忆化搜索更符合直觉
-
根据独立性拆分子问题 CF1097D
-
转化成二维图像问题,然后拆分成三个子问题,通过数轴变换求解 AT_agc019_f
生成函数
exp是e的泰勒展开
意义
生成函数的意义,是对组合问题进行范式转换,把离散的组合结构翻译成连续的、可分析的代数对象,用整个分析学的武器库去处理组合问题。
其副产品是解递推求通项
运算
生成函数的运算在定义上是形式幂级数的代数运算,可以用封闭形式做四则运算然后转成形式幂级数
形式幂级数乘除法实际上等价于背包和退背包AT_fps_24_g
普通生成函数OGF(无标号)
求斐波那契通项
退背包
指数生成函数EGF(有标号)
FFT(❌️)
nlogn做多项式乘法
NTT是取模的FFT
EX
超集求和(SOS DP) CF482C
S属于T,则dp[S]+=dp[T],从大集合到小集合转移
8.2
博弈论
对称模仿策略AT_abc278_g,AT_agc002_e
配对策略qoj15321
周期优化CF1704F
合作博弈hdu7393
构造方案abc278g
8.3
构造
重在人类思考路径,而非结论
分块构造,折半构造,建图构造(CF1270G)
随机构造,正负构造hdu6804
随机
K-path color coding(hdu6664)
trick
找二元组集合使之r减l为0的trick,即建基环树找环(CF1270G)

浙公网安备 33010602011771号