数学篇
数学
中位数
- 中位数定理:如果有一个数轴,数轴上有若干个点。要在数轴上找一点,使得它到各个点的距离之和最短。
仓库选址
双生双宿之错 - 中位数性质:显然一个奇数组内大于中位数的个数等于小于中位数的个数
- 常规解题思路:利用上述性质,将小于中位数的设置为1,大于等于中位数的设置-1,只要一个区间内的和0,那么就存在这么一个中位数
E1. Submedians (Easy Version):二分答案+利用上述性质
容斥原理
又名抽屉原理:
容斥原理的符号本质是 “修正重复计数”:
计算并集时,“奇加偶减”(集合个数为奇时加,偶时减)
计算并集的补集时,符号反转,表现为 “奇减偶加”
智乃的数字:直接的应用
C. Count Good Numbers
绝对值
求绝对值函数值时,可以考虑拆绝对值
结论
\(max(|x|,|y|)=\frac{|x+y|-|x-y|}{2}\)
位运算
A Good Problem: 奇数时显而易见,全部取l,偶数时取n-2个相同x,2个相同y,找出x&y=0即可,找不出即-1,n=2时需要特判
快速幂
适用于指数较大的情况下
快速加
矩阵快速幂
P1939 矩阵加速(数列):板子题必会
应用:
AcWing 205. 斐波那契:斐波拉契数列的矩阵快速幂
简单题+:计算斐波拉契数列和
广义斐波拉契数列
P1306 斐波那契公约数:优质题解,补充了很多斐波拉契数列的性质及其证明
斐波拉契数列 f(n)=f(n-1)+f(n-2)
\(\begin{bmatrix} f(n) \\ f(n-1) \end{bmatrix}=\begin{bmatrix} 1 & 1\\ 1 & 0 \end{bmatrix}^{n-1} \begin{bmatrix} f(2) \\ f(1) \end{bmatrix}\)
-
$ \gcd(f_n, f_{n-1}) = 1 $
-
$ f_{m+n} = f_{m+1}f_n + f_m f_{n-1} $
-
$ f_k \mid f_n \iff k \mid n $
奶龙来了 -
$ \gcd(f_n, f_m) = f_{\gcd(n, m)} $
-
\(s(n)=\sum_{1}^{n}f(i)=2*f(n)+f(n-1)-1\)
求前缀和
前缀和数列和原数列由矩阵联系
$\begin{bmatrix} sum_1 \ sum_2 \ sum_3 \ \end{bmatrix}= \begin{bmatrix} 1 & 0 & 0 \ 1 & 1 & 0 \ 1 & 1 & 1 \ \end{bmatrix} \begin{bmatrix} a_1\ a_2 \ a_3 \ \end{bmatrix} $
求多次前缀和可用矩阵快速幂
例题:
F. Prefix Sums
进制问题
「LAOI-15」异变危机:思维题,发现对于s,先取10进制转化成s进制,一定成为10,再看成t进制转化成10进制,一定是等于t,基于此思考不可能的情况
两道类似的题
E. Living Sequence:方便理解的题解
还在分糖果!
常见的数学性质
一些性质经常出现在题目中,适当利用就是解题关键
排列
n个数排列代表每个数不重不漏的出现一次,经常出现在题目中
B. Make It Permutation:同时也需要思维,\(i \in [2,n]\),翻转[1,i],然后\(i \in [1,n-1]\),翻转[i+1,n].第一步很好想,因为可以使得第一列全排列,顺着思考,翻转第一排的[2,n],第二列就也是全排列,然后发现这就是规律
MEX
\(MEX a_i\)意味着不超过数组a中最小的数的最大自然数,例如:\(MEX\{2,3,4\}=1\)
一般套路,先考虑\(MEX{a_i}=x\),是否存在x
-
你怎么知道我玩原神还是玩刻晴的?: 考虑是否存在连续的子数组存在1,而此时由于有1,所以gcd也为1,所以只有区间内没有1且gcd为1时才对答案有贡献
异或
线性基
G. Shortest Path Problem?:异或最短路
P4151 [WC2011] 最大XOR和路径
异或是常见考点
E. Adjacent XOR:每个只能异或一次,而\(a_i\)异或的值要么是\(a_{i+1}\)要么是\(b_{i+1}\)
小苯的xor图:对于多个数异或,形如\(a \oplus (b+c+d+....)\),可以转化对应二进制下每位的数量进行异或
性质或结论:
-
\[x \oplus y \oplus z >= x \& y \& z (x,y,z均为非负整数) \]
小苯的序列合并: 关键x ^ y ^ z >= x & y & z
-
\[x + y - (x \oplus y)=2*(x \& y) \]
谁敢动资本的蛋糕:由上述定理,\(s=\sum_{i=1}^{n}a_i\),而每次合并需要\(-cost(x,y)=(x \oplus y)-(x+y)\),最终值为\(sxor=\oplus_{i=1}^{n}a_i\),所以\(ans=s-sxor\)
数论
整除及取余
整除
例题:Subset Multiplication:
$ x $ 一定是 $ b_i / \gcd(b_i, b_{i+1}) $ 的倍数
已知 $ b_i = a_i \cdot x $(被乘 $ x $),需满足原数组的整除性 $ a_i \mid a_{i+1} $。
$ a_{i+1} $ 对应 $ b_{i+1} $
$ b_{i+1} = a_{i+1} $(未被乘 $ x $):
则 $ a_i \mid a_{i+1} \to \frac{b_i}{x} \mid b_{i+1} $,变形为 $ b_i \mid b_{i+1} \cdot x $。
设 $ d = \gcd(b_i, b_{i+1}), b_i = d \cdot m, b_{i+1} = d \cdot n , \gcd(m, n) = 1 $
代入得 $ d \cdot m \mid d \cdot n \cdot x $,约去 $ d $ 后得 $ m \mid n \cdot x $。
由于 $ \gcd(m, n) = 1 $, m 必须整除 x (否则 $ m $ 和 $ n $ 的公共因子会破坏 $ \gcd(m, n) = 1 $ )
而 $ m = \frac{b_i}{d} = \frac{b_i}{\gcd(b_i, b_{i+1})} $,故 $ x $ 必须是 $ \frac{b_i}{\gcd(b_i, b_{i+1})} $ 的倍数。
而对于整个序列,x是所有$ \frac{b_i}{\gcd(b_i, b_{i+1})} $的最小公倍数
D. Price Tags:注意分析时间复杂度,以及运用向上取整的公式
小红的k次方: 整除\(30^k\)其实就是整除\((2*3*5)^k\)
- 小tips
$\lceil \frac{x}{n} \rceil=\frac{x+n-1}{n} $
$\lfloor \frac{x}{n} \rfloor=\frac{x- x \mod n}{n} $
数论分块
取余及同余
倍数关系:
3的倍数满足,所有数相加和为取余为0,9的倍数同理
11的倍数:利用余数之间的关系
小红的好数对
数位关系:
数位之和f(n)=(n-1)%9+1
向下取整,取余:利用取余的性质,将向下取整取余

幂中幂plus:由于mod较小,可以找出循环节
赛瓦维斯特定理:已知a,b为大于1的正整数,gcd(a,b)=1,(a,b的最大公约数=1)则使不定方程ax+by=C不存在非负整数解的最大整数(C是最大的 使不定方程 没有 非负整数解 的数。)C=a×b−a−b
得不到的爱情
B. Add 0 or K:令\(a_i+k*c_i\)能被g(g>1)整除,\(g=k+1,c_i=a_i mod (k+1)\)成立
B - Another Divisibility Problem:数论推导
同余
P5656 【模板】二元一次不定方程 (exgcd)
P2613 【模板】有理数取余
练习题:
P1082 [NOIP 2012 提高组] 同余方程
约数
可以由若干个素数相乘得到
-
约数之和:一个数的约数是不同次数的素因子的相乘,由此可以推出解题公式
-
约数个数:一个的约数个数是素因子的次数相乘得到,不同的素因数次数,决定一个不同的因数
同时满足条件的一定是完全平方数,因为题目要求 "因数个数是质数且≠2"。设因数个数为质数p(p≠2),则根据因数个数公式:\((p_1+1)(p_2+1)...(p_n+1)\),p只能是单个因子的乘积(即p = e+1,其中e是某个质因子的指数)。由于p是奇质数(≠2),则e = p-1是偶数,因此原数一定是平方数(e为偶数时,\(p^e = (p^(e/2))²\)
素数
-
素数一定是奇数:B 上海保卫战
-
质因数分解:任意一个整数都可以唯一地分解成多个质因数的乘积
C. Count Good Numbers:分解成小于位数小于的质因数不好,所以只需要找到任取2,3,5,7,组成的最小公倍数
E. Card Game Again:分解k,找满足区间素数个数大于k的各个质因子
立方数:将n质因数分解,因数次数为cnt,\(A×(n的因数)^ {(cnt/3)},B*=cnt%3\),由于我们只要求输出A,所以只需要考虑质因数的四次方不大于n,这样的质因数才会有对A,有贡献 -
欧拉筛
变式:- [蓝桥杯 2022 国 A] 选素数/Primal Sport:在筛素数的同时,记录每个数的最大质因数
- 质数距离:考虑对于任意一个合数 x,他必定存在一个最小的质因子 d
,且这个最小的质因子 $ d<=sqrt(n) $,以此来筛选区间内所有合数
GCD 与 LCM
前置芝士
\(gcd(a,b)=\gcd(b,a \% b)\)
\(lcm(a,b)=\frac{a \times b}{\gcd(a,b)}\)
LCM补充知识:
- LCM(x, y) 的过程实际上是对 x, y 的每个质因子个数取max的过程。
- 如果 LCM(x, y)!= x,那么如果仅对 y 进行 LCM 操作是无法变成 x 的。
-
简单应用
[蓝桥杯 2023 国 A] 切割:切割成变成正方形,且使得正方形最多,就是找最小公约数,而最小公约数小于最大公约数,枚举因数寻找
小红与gcd和sum:根据gcd的性质,枚举gcd值,从而求出子序列最大值
D. Yet Another Array Problem:思维,最小的使其互质的数一定是质数,否则可以将他分解成质数 -
手推结论
GCD plus LCM,利用上述两个结论就可以很快推出,推不出来看题解
E. Vasya's Function:可以理解为求gcd(x,y),y不断减去gcd(x,y)的次数,暴力求解超时,可以发现y在一定范围内存在相同的gcd(x,y) -
与素数唯一分解定理结合
[蓝桥杯 2024 国 A] gcd 与 lcm:简单的利用上述性质推导之后,需要构造的数组的每个元素由质因数组成.(题解) -
利用互质关系转化
\(gcd(a,b*c)=gcd(a,b)\) if $ gcd(a,c)=1 $ -
求周期
A.小红的数组查询(二)
逆元
零碎知识点:
- \(inv(inv(i))=i\)
组合数
前置知识:
- 求阶乘:用递推f[n]=f[n-1]*i
- 求逆元:因为求组合数时,存在分母取模,而分母是阶乘,所以需要求阶乘逆元.
求组合数
- 公式:\(C_{n}^{m}=\frac{n!}{(n-m)!m!}\)
- 杨辉三角恒等式:\(\dbinom{a}{b} + \dbinom{a}{b-1} = \dbinom{a+1}{b}\)
- 卢卡斯定理:主要用求大组合数取模
- 简单例题:
-伊菲的比赛:简单的推公式,高中问题
范德蒙德恒等式
\(C_{n+m}^{k}=\sum_{i=0}^{k}C_{n}^{i} * C_{m}^{k-i}\)
F - 1122 Subsequence 2
多重组合数
多重组合数(也称为多重排列数)是组合数学中用于计算有重复元素的排列方式数的概念。
假设有 $ k $ 种“类型”的元素,第 $ i $ 种类型有 $ n_i $ 个完全相同的元素。将所有元素(总共有 $ n = n_1 + n_2 + \dots + n_k $ 个)排成一列,这样的排列方式总数就是多重组合数。
计算公式
多重组合数的公式为:
其中:
- $ n = n_1 + n_2 + \dots + n_k $(总元素数);
- $ n_i! $ 是第 $ i $ 种类型元素的“内部重复数”(因为相同元素的排列会被视为重复,需要除去)。
k部分拆分数
构造序列:简单例题
期望
J - Points on the Number Axis A:期望位置 = 所有初始点的平均值,[题解]
几何分布
(https://codeforces.com/gym/105139/attachments/download/25287/Sol_ICPC_hubei_24.pdf)
擅长解密的小红同学
确定密码的总长度和排列数
设每个数字0-9出现的次数为$ a_0, a_1, \dots, a_9 ,密码的总长度为 n = a_0 + a_1 + \dots + a_9 $。
由于密码是这些数字的一个排列(顺序不同则密码不同),所以总共有$ \frac{n!}{a_0! \cdot a_1! \cdot \dots \cdot a_9!} $种不同的有效密码**(这是多重排列的计算公式,分母是各数字出现次数的阶乘之积,用于消除重复数字的排列冗余)。
分析尝试次数的期望
每次尝试成功的概率是“当前尝试恰好是正确密码”的概率。由于每次尝试后密码重置,且所有可能的密码是等概率被尝试的,因此这是一个几何分布问题。
对于几何分布,“首次成功的期望次数”等于“成功概率的倒数”。这里成功概率$ p = \frac{1}{\text{总排列数}} $,因此期望尝试次数为:
博弈论
取石子游戏
规则
有 1 堆石子,共 n 个;
两人交替取,每次至少取 1 个,最多取 m 个;
最后取完石子的人获胜
必败态:当 n % (m+1) == 0 时,当前玩家必败(无论取 k 个,对手都能取 m+1 -k 个,最终对手取完)。
必胜态:当 n % (m+1) != 0 时,当前玩家必胜(先取 n % (m+1) 个石子,让剩余石子数为 m+1 的倍数,迫使对手进入必败态)
-
例题I Wanna Win the Cards:每次取至少一个,之多k个不为种植不为1的数
-
DP或递推:
照天地苍茫,却有花影成双:1,2,3的情况确定,于是可以一个一个推出大于3的情况,那么对于第i个,如果减去所有的小于的i的平方数都无法胜利,那么就失败
D - The Simple Game :在这种博弈论任务中,从最终状态回溯获胜者通常很有效 -
搜索
Games may be harmful:记忆化搜索的时间复杂度是足够的,根据博弈关系搜索
点击查看代码
#include <bits/stdc++.h>
using namespace std;
// 记忆化存储:键为当前状态(a, b)(桃血量a,敌人血量b),值为博弈结果
// 结果定义:0=桃败,1=循环,2=桃胜
map<pair<long long, long long>, int> memo;
/**
* @brief 递归判断当前血量状态(a, b)下桃的最终结果
* @param a 桃当前的血量
* @param b 敌人当前的血量
* @return int 0=桃败,1=循环,2=桃胜
*/
int dfs(long long a, long long b) {
// 特殊状态:(1,1)经推导必为循环态(双方无法让对方血量归0,无限循环)
if (a == 1 && b == 1) {
return 1;
}
// 构造当前状态的键,检查是否已计算过,避免重复递归
auto state = make_pair(a, b);
if (memo.count(state)) {
return memo[state];
}
// tr[0]:桃选择“加血”后的最终结果;tr[1]:桃选择“跳过”后的最终结果
int tr[2];
// 循环枚举桃的两种行动:i=0→加血(a+1),i=1→跳过(a不变)
for (int i = 0; i < 2; i++) {
long long a1 = a + i; // 桃行动后的血量(i=0加1,i=1不变)
// er[0]:敌人应对“加血”后的结果;er[1]:敌人应对“跳过”后的结果
int er[2];
// 循环枚举敌人的两种应对:j=0→加血(b+1),j=1→跳过(b不变)
for (int j = 0; j < 2; j++) {
long long b1 = b + j; // 敌人应对后的血量(j=0加1,j=1不变)
// 结算阶段:1.交换血量 2.向下取半(a_new=敌人行动后血量//2,b_new=桃行动后血量//2)
long long a_new = b1 / 2; // 桃结算后的新血量
long long b_new = a1 / 2; // 敌人结算后的新血量
int res; // 当前应对方式下的结果
if (a_new == 0 && b_new == 0) {
// 双方结算后血量均为0,按规则补1血,进入(1,1)状态
res = dfs(1, 1);
} else if (b_new == 0) {
// 敌人结算后血量为0→桃胜
res = 2;
} else if (a_new == 0) {
// 桃结算后血量为0→桃败
res = 0;
} else {
// 双方血量均不为0,递归判断新状态(a_new, b_new)
res = dfs(a_new, b_new);
}
er[j] = res; // 记录敌人当前应对的结果
}
// 敌人会选择对桃“最不利”的结果(取两种应对的最小值)
tr[i] = min(er[0], er[1]);
}
// 桃会选择对自己“最有利”的结果(取两种行动的最大值)
// 存入记忆化缓存,避免后续重复计算
memo[state] = max(tr[0], tr[1]);
return memo[state];
}
int main() {
int T; // 测试用例数量
cin >> T;
// 桃败时需要输出的固定字符串(题目给定,不可修改)
string lose_str = ")YRU380ilgpbfpiUkrhr89fH*RT#QYU(_&U*)$ Q@&#!@*)R";
// 处理每组测试用例
while (T--) {
long long a, b; // 每组用例的初始血量(桃a,敌人b)
cin >> a >> b;
// 清空记忆化缓存:避免上一组用例的状态干扰当前组
memo.clear();
// 获取当前初始状态的博弈结果
int result = dfs(a, b);
// 根据结果输出对应内容
if (result == 2) {
cout << "EZ GAME\n"; // 桃胜
} else if (result == 0) {
cout << lose_str << '\n'; // 桃败
} else {
cout << "KUYASHI---!!!\n"; // 循环
}
}
return 0;
}
-
博弈反推
小红拿石子2.0:从最终态反推启发思考 -
思考
D. Game on Array: 可以考虑对单独一个数 -
归纳
2024 Jiangsu Collegiate Programming Contest:K. Number Deletion Game:极大值的奇偶性决定次大值的奇偶性,决定最终的winner
计算几何
三角形
小红的整数三角形:三角形面积公式∣(x2−x1)(y3−y1)−(x3−x1)(y2−y1)|/2
距离
曼哈顿距离:\(|x_1-x_2|+|y_1-y_2|\)
欧式距离: \(\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}\)
D 距离之比:利用三角换元
凹包和凸包
凸多边形:所有顶点的 “转向” 方向完全一致(要么全逆时针,要么全顺时针)。
凹多边形:至少存在一个顶点的 “转向” 方向与其他顶点相反(即存在凹角)
凹包
逆时针遍历三个点l,i,r,向量分别为b(l->i),c(i->r),利用叉积判断转向,若值全部为正或者负,为凸多边形,存在不同的即为凹多边形
对应习题:
凹包
凸包
严格凸的核心条件是:任意边长度 < 其余边长度和
C. Symmetrical Polygons:偶数次必拿,奇数次木棒考虑拿一个还是拿两个,需要满足上述条件


浙公网安备 33010602011771号