浅谈两种常用定值构造方法:二进制与斐波那契拆分
更好的阅读体验:https://dk-qwq.github.io/blog/posts/bin-fib-decomposition/
核心思想:基础图 + 调节器
无论是哪种定值构造方法,本质都是通过构造对数级别的基底,然后通过调节器使用类似二进制或斐波那契的拆分方法来构造出目标定值。
一、二进制拆分法
1. 原理简述
通过观察价值函数,构造形如
2. 习题
Codeforces 388B - Fox and Minimal path
【题意】
给定一个整数
【题解】
不难想到使用菱形的形式构造,使得到达单点有
【优化:如何使得
基础的菱形形式依然有些浪费,考虑如下形式优化基础图:
后面拼接的定长路径也可以复用
参考提交:https://codeforces.com/contest/388/submission/387215801
AtCoder ABC 108 D - All Your Paths are Different Lengths
【题意】
构造一个带权有向图,使得从
【题解】
假设我们已经有从
经过尝试可以发现,分别连权值为
以此类推,点数为
参考提交:https://atcoder.jp/contests/abc108/submissions/78452048
二、斐波那契拆分法
1. 原理简述
构造
2. 正确性证明 (Zeckendorf's theorem)
【Zeckendorf's theorem】
任何正整数
1. 存在性证明
- 存在
k 使得F_k \leq N < F_{k+1} ,我们选定F_k 。 - 因为
N < F_{k + 1} = F_k + F_{k - 1} ,所以有:N' = N - F_k < F_{k - 1} 这保证了对
N' 继续贪心分解时,其选定的下一项斐波那契数必定小于F_{k-1} ,天然满足不相邻的条件。
2. 唯一性证明
- 引理:由不大于
F_n 且互不相邻的斐波那契数列构成的子集和,严格小于F_{n + 1} 。\sum_{i \leq n} F_{c_i} \leq F_n + F_{n - 2} + F_{n - 4} + \cdots + F_1 = F_{n + 1} - 1 < F_{n + 1} - 反证法:假设存在两种不同的
N 分解方式,找出最大的且在两个集合中存在性不同的斐波那契数,记为F_k 。不妨设F_k \in A 且F_k \notin B 。 - 删掉两个集合中大于
F_k 的公共部分后,剩余部分的值记为N' 。 - 此时
N' 的两种分解方式为:N' = F_k + \sum_{F_i \in A, i<k} F_i 以及N' = \sum_{F_i \in B, i<k} F_i 。 - 根据引理,集合
B 中所有小于F_k 且不相邻的斐波那契数之和严格小于F_k :N' = \sum_{F_i \in B, i<k} F_i < F_k - 但在集合
A 中,N' 至少包含了F_k ,即N' \geq F_k ,这就得出了矛盾。故分解方式必然唯一。
3. 习题
2026牛客多校9A
【题意】
记
要求构造一个简单无向图,使得
【题解】
由于为简单图,连边形式应为
尝试此种连边方式:
-
基础图
1, \cdots, b 之间连接(i - 2) - i, (i - 1) - i ,则有P_i = F_i 。 -
记基础图贡献为
C_b ,则:C_b - C_{b - 1} = 2 P_b + P_{b - 1} + P_{b - 2} = 3 P_b
考虑如何调节:
-
在节点
i 下挂一个节点的贡献为2 F_i ,不能改变奇偶性。 -
发现最小可以通过新增点连接基础点
2, 3 得到9 的贡献来调节奇偶性。
最终可以得到:
-
找到最大的
b 使得C_b \leq K ,对于余数为奇数,先减9 ,剩余偶数除以2 ,由 Zeckendorf's theorem 一定可以分解。 -
倘若余数为奇数且小于
9 ,b := b - 1 即可,所需贡献的增长仅为3 P_b ,由于没有互不相邻的要求,任意贪心构造定然有解。
选择建议
- 对于点数较少的题目,建议使用二进制拆分法。
- 若有要求为简单图,且点数较多,建议使用斐波那契拆分法。
当然还是看题目价值函数来做最好。