数学篇

数学

中位数

  • 中位数定理:如果有一个数轴,数轴上有若干个点。要在数轴上找一点,使得它到各个点的距离之和最短。
    仓库选址
    双生双宿之错
  • 中位数性质:显然一个奇数组内大于中位数的个数等于小于中位数的个数
  • 常规解题思路:利用上述性质,将小于中位数的设置为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}\)

  1. $ \gcd(f_n, f_{n-1}) = 1 $

  2. $ f_{m+n} = f_{m+1}f_n + f_m f_{n-1} $

  3. $ f_k \mid f_n \iff k \mid n $
    奶龙来了

  4. $ \gcd(f_n, f_m) = f_{\gcd(n, m)} $

  5. \(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

异或

线性基

G. Shortest Path Problem?:异或最短路
P4151 [WC2011] 最大XOR和路径

异或是常见考点

E. Adjacent XOR:每个只能异或一次,而\(a_i\)异或的值要么是\(a_{i+1}\)要么是\(b_{i+1}\)
小苯的xor图:对于多个数异或,形如\(a \oplus (b+c+d+....)\),可以转化对应二进制下每位的数量进行异或

性质或结论:

  1. \[x \oplus y \oplus z >= x \& y \& z (x,y,z均为非负整数) \]

    小苯的序列合并: 关键x ^ y ^ z >= x & y & z

  2. \[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\)

\[\bigoplus_{i=1}^{n} i = \begin{cases} 1 & n \bmod 4 = 1 \\ n + 1 & n \bmod 4 = 2 \\ 0 & n \bmod 4 = 3 \\ n & n \bmod 4 = 0 \end{cases} \\ 4k\oplus(4k+1)\oplus(4k+2)\oplus(4k+3)=0 \]

K. Party Games

数论

整除及取余

整除

例题: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} $

数论分块

小苯的GCD疑问2.0

取余及同余

倍数关系:
3的倍数满足,所有数相加和为取余为0,9的倍数同理
11的倍数:利用余数之间的关系
小红的好数对
数位关系:
数位之和f(n)=(n-1)%9+1
向下取整,取余:利用取余的性质,将向下取整取余
image

幂中幂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))²\)

  • 牛牛的约数: 注意到约数必然小于等于\(a_i/2\),所以从i-1枚举,最多枚举64次,详细题解

素数

  • 素数一定是奇数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补充知识:

  1. LCM(x, y) 的过程实际上是对 x, y 的每个质因子个数取max的过程。
  2. 如果 LCM(x, y)!= x,那么如果仅对 y 进行 LCM 操作是无法变成 x 的。

逆元

零碎知识点:

  1. \(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 $ 个)排成一列,这样的排列方式总数就是多重组合数
计算公式
多重组合数的公式为:

\[\frac{n!}{n_1! \cdot n_2! \cdot \dots \cdot n_k!}=\boxed{\frac{n!}{n_1! \cdot n_2! \cdot \dots \cdot n_k!} = \binom{n}{n_1} \cdot \binom{n-n_1}{n_2} \cdot \binom{n-n_1-n_2}{n_3} \cdot \dots \cdot \binom{n_k}{n_k}} \]

其中:

  • $ n = n_1 + n_2 + \dots + n_k $(总元素数);
  • $ n_i! $ 是第 $ i $ 种类型元素的“内部重复数”(因为相同元素的排列会被视为重复,需要除去)。

例题:
E - Count Sequences 2

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{总排列数}} $,因此期望尝试次数为:

\[\text{期望} = \frac{1}{p} = \text{总排列数} = \frac{n!}{a_0! \cdot a_1! \cdot \dots \cdot a_9!} \]

L. 502 Bad Gateway:
image

博弈论

取石子游戏

规则
有 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;
}

计算几何

三角形

小红的整数三角形:三角形面积公式∣(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:偶数次必拿,奇数次木棒考虑拿一个还是拿两个,需要满足上述条件

posted @ 2025-09-28 17:51  归游  阅读(8)  评论(0)    收藏  举报