数学/计数做题笔记

数学/计数做题笔记

P4159 [SCOI2009] 迷路

矩阵快速幂优化递推。

首先最暴力的想法,设 $ f_{i,j} $ 在 $ j $ 时刻,到达点 $ i $ 的种类数。

枚举时间和 $ i $,然后 $ f_{i,j} = \sum\limits_{k=1}^n {f_{k,j-w[i][k]}} $。

时间很大,所以肯定行不通。

这样显然是不能用矩阵来优化的。

考虑拆点,每个点拆成九个点,对于一条边 $ u,v,w $,从 $ f_{u,0} $ 向 $ f_{v,w} $ 连一条边权为 1 的边,然后对于每个点,从 $ f_{u,i} $ 向 $ f_{u,i-1} $ 连一条边。

然后矩阵快速幂即可。

CF446C DZY Loves Fibonacci Numbers

分块板子题,区间加斐波那契数列。

其实和区间加等差数列差不多,每个块维护块头的 $ f_1 $ 和 $ f_2 $。

查询的时候直接下传递推即可。

P3265 [JLOI2015] 装备购买

实数线性基板子题。

AT_abc223_h [ABC223H] Xor Query

区间线性基。

有一个显然的做法是线段树上维护线性基,但是是 $ O(n\log^3n) $ 的,我不想卡常,所以没写。

考虑一点智慧的做法,给线性基做一个前缀和。

第 $ i $ 个线性基表示前 $ i $ 个数组成的线性基,并且记录一下这个位置是原序列上的哪个数。

由于我们到时候要删掉 $ [1,l-1] $ 的数,所以每一次插入的时候贪心的保留后面的。

查询的时候把记录的 $ idx \le l-1 $ 的数删掉就好了。

P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III

并非题单内的题,但是突然看到了就写一下吧。

预处理第 $ i $ 个块的众数,前 $ i $ 个块中 \(j\) 出现了多少次。

查询的时候答案只可能是散块内出现的数和整块众数,这个量级是 $ \sqrt{n} $ 的。

暴力枚举个数统计答案即可。

woc 怎么要卡空间?

对每个数开个 vector,然后预处理出 $ [l,r] $ 块的答案。

拿着答案的个数对着左边散块扫,扫到合法的就把答案向后推。

P4458 [BJOI2018] 链上二次求和

简单推式子题 并非简单。

简单推下式子,记 $ S_n = \sum\limits_{i=1}^n a_i ,SS_n = \sum\limits_{i=1}^n S_i ,SSS_n = \sum\limits_{i=1}^n SS_i $:

$ \sum\limits_{len=l}^r \sum\limits_{i=len}^n \sum\limits_{j=i-len+1}^i a_j$

$ = \sum\limits_{len=l}^r \sum\limits_{i=len}^n S_i - S_{i-len} $

$ = \sum\limits_{len=l}^r (\sum\limits_{i=len}^n S_i - \sum\limits_{i=0}^{n-len} S_i) $

$ = \sum\limits_{len=l}^r {SS_n - SS_{len-1} - SS_{n-len}} $

$ = \sum\limits_{len=l}^r {SS_n} - \sum\limits_{len=l-1}^{r-1} SS_{len} - \sum\limits_{len=n-r}^{n-l} SS_{len} $

$ = (r-l+1) {SS_n} - SSS_{r-1} + SSS_{l-2} - SSS_{n-l} + SSS_{n-r-1} $

然后维护 $ SS,SSS $ 就可以了。

再记 $ sum_0(n) = \sum\limits_{i=1}^n a_i,sum_1(n) = \sum\limits_{i=1}^n a_i \times i , sum_2(n) = \sum\limits_{i=1}^n a_i \times i^2 $。

那么 $ SS_n = \sum\limits_{i=1}^n \sum\limits_{j=1}^i a_j = \sum\limits_{j=1}^n a_j \times (n-j+1) = (n+1) \times sum_0(n) - sum_1(n) $。

$ SSS_n = \sum\limits_{i=1}^n \sum\limits_{j=1}^i \sum\limits_{k=1}^j a_k = \sum\limits_{i=1}^n \sum\limits_{j=1}^i a_j \times (i+1-j) $

$ = \sum\limits_{j=1}^n a_j \sum\limits_{i=j}^n (i+1-j) $

$ = \sum\limits_{j=1}^n a_j \sum\limits_{i=1}^{n-j+1} i $

$ = \sum\limits_{j=1}^n a_j \times \dfrac{(n-j+1)(n-j+2)}{2} $

$ = \dfrac{1}{2} \sum\limits_{i=1}^n a_i \times (i^2 - (2n+3)i + (n+1)(n+2)) $

$ = \dfrac{1}{2} (sum_2(n) - (2n+3) sum_1(n) + sum_0(n) (n+1)(n+2)) $

那么在线段树上维护 $ sum_0,sum_1,sum_2 $ 就可以了。

P4389 付公主的背包

前面忘了,中间忘了,后面忘了,反正这题要多项式。

把每个体积的生成函数的封闭形式乘起来,得到 $ res = \prod\limits_{i=1}^n \dfrac{1}{1 - x^{a_i}} $。

后面好像两边 $ \ln $ 再 $ \exp $ 之后就可以了,但是我不会,数学功底不够,后面再来补。

CF995F Cowmpany Cowmpensation

非常牛的一道 DP 题。

首先有一个很显然的树形 DP。

设 $ f_{u,i} $ 为节点 $ u $ 及儿子权值不超过 $ i $ 的方案数。

转移方程为 $ f_{u,i} = \prod\limits_{v \in son_u} f_{v,i} $ 。

这样转移就是 $ O(nd) $ 了,无法接受。

记子树大小为 $ siz_u $,那么 $ f(u,x) $ 为关于 $ x $ 的 $ siz_u $ 次函数。

证明我不会。

反正 $ d $ 的上界缩减到了 $ n $,时间复杂度 $ O(n^2) $。

最后用拉格朗日插值算一下答案就好了。

AT_yahoo_procon2019_qual_e Odd Subrectangles

01 矩阵权值和为奇数等价于异或和为 1。

假定现在已经选出了要选哪些行,那么我们挑一列异或和为 1 的出来,若其它列的异或和为 0,那就选这一列,若其它列的异或和为 1,就不选这一列。这样一共有 $ 2^{m-1} $ 种方案。

但要是选一些行出来它们的异或和为 0 就无法挑选出一列异或和为 1 的了,所以要减去异或和为 0 的子集的方案数。

考虑线性基,把每行看成一个数插入线性基,记线性记的大小为 $ siz $,那么根据线性基的性质异或和为 0 的方案数就有 $ 2^{n-siz} $ 种。

那么总方案数即为 $ 2^{m-1} \times (2^n - 2^{n-siz}) $。

P11364 [NOIP2024] 树上查询

也不是题单内的题,但是惦记这题好久了,也该写一下了。

非常套路的,计算出每一个 $ LCA $ 的支配对,每个支配对形如 $ [L,R,LCA] $。

然后可以转化为三维数点,记询问区间为 $ [l,r,k] $,分为三种相交的情况讨论:左边相交,右边相交,包含。

\[R-l+1 \ge k \]

\[r-L+1 \ge k \]

\[R-L+1 \ge k \]

然后对答案的贡献就是 $ dep_{LCA} $。

时间复杂度 $ O(n \log^2 n) $ 的。

posted @ 2025-07-18 16:16  LittleFoxFairy  阅读(12)  评论(0)    收藏  举报