Note 5.26-5.28
Luogu5303 [GXOI/GZOI2019]逼死强迫症
设\(f(i)=f(i-1)+f(i-2),f(0)=f(1)=1\),即是\(2 \times i\)的铺放方案数;再考虑两块碎砖的距离,有\(Ans=2 \times \sum_{i=3}^{n} \sum_{j=0}^{n-i} f(j)\times f(n-i-j)\);设\(g(n)=\sum_{i=0}^{n} f(i) \times f(n-i)\),展开有\(g(n)=g(n-1)+g(n-2)+f(n-1)+f(n-2)\);那么矩阵快速幂即可。
Luogu4495 [HAOI2018]奇怪的背包
假设选择了物品\(t_1,t_2,...,t_k\),那么\(\sum_{i=1}^{k} a_i V_{t_i} \equiv w \pmod P\),不难发现在模\(P\)意义下,a_i的取值范围相当于\(R\),所以有\(gcd(V_{t_1},V_{t_2},...,V{t_k},P)|w\),即:\(GCD_{i=1}^{k} gcd(V_{t_i},P)|w\),考虑dp,设\(f(i,j)\)表示考虑到与\(P\)公约数为\(i\)的一组数,现在的总约数为\(j\)的方案数,转移即可。对于一个\(w\),其答案就是$\sum_{d|w} f(..,d) $,是可以预处理的。
Luogu5300 [GXOI/GZOI2019]与或和
拆位,问题就变成了对于一个01矩阵,求它的全1子矩阵个数,处理出每个点的最高高度,单调栈统计即可,最后乘上答案即可。
Luogu4606 [SDOI2018]战略游戏
首先建圆方树。发现要摧毁的点是割点,割点满足什么条件呢,观察到它一定是\(u\)到\(v\)在圆方树上的简单路径上的圆点(不包括端点)。那么多个点怎么统计呢?用树链的并统计圆点个数即可,注意最后要减去不能摧毁的\(|S|\)个点。
Luogu5330 [SNOI2019]数论
考虑在模\(B\)剩余系下计算贡献,不难发现对于加A成\(gcd(A,B)\)环,在环上的贡献可以\(O(1)\)递推,大致分类讨论一下即可,所以最后可以\(O(n)\)的算出所有模B剩余系下的点的贡献。
Luogu5323 5323 [BJOI2019]光线
设\(f(i)\)表示第\(i\)层玻璃上部进光量,\(g(i)\)表示第\(i\)层玻璃下部进光量,有\(a_if(i)+b_ig(i)=f(i+1)\),\(a_ig(i)+b_if(i)=g(i-1)\),\(f(1)=1\),\(g(n)=0\),从上到下依次消元即可。
Luogu5327 [ZJOI2019]语言
考虑对于每个点分别计算贡献,那么\(u\)所能匹配的点数就是经过它的路径的并。如何统计所有点的答案呢?采用\(dfs\)序线段树维护树链的并,就可以做到动态插入删除路径,对于路径的插入删除,考虑用树上差分打标记实现,那么一个点对应的线段树就由子树继承而来,套上线段树合并即可。
Luogu5280 [ZJOI2019]线段树
设\(f(x)\)表示节点\(x\)有标记的线段树占总数比例,\(g(x)\)表示节点\(x\)到根路径有标记的线段树占总数比例,那么每一次修改就是:
1.到达目标节点前经过的节点:\(f(x)=\frac{f(x)}{2}\),\(g(x)=\frac{g(x)}{2}\)。
2.目标节点:\(f(x)=\frac{1}{2}+\frac{f(x)}{2}\),\(g(x)=\frac{1}{2}+\frac{g(x)}{2}\)。
3.目标节点子树内的节点:\(f(x)=f(x),g(x)=\frac{1}{2}+\frac{g(x)}{2}\)。
4.PushDown但未经过的节点:\(f(x)=\frac{f(x)}{2}+\frac{g(x)}{2}\),\(g(x)=g(x)\)。
5.其他节点不变。
具体修改用懒标记实现即可,答案就是\(NUM \times \sum_{i=1}^{tree_tot} f(i)\)。
Luogu2481 [SDOI2010]代码拍卖会
发现对于一个数,一定可以表示为\(\sum_{i=1}^{t} \frac{10^{k_i}-1}{9}(t \leq 9)\)。而\(\frac{10^{k_i}-1}{9}\)这样的数模\(P\)是有周期的,长度\(O(P)\),直接考虑dp。设\(f(i,j,k)\)表示考虑到余数为\(i\)的一组数时,已经选了\(j\)个数,当前余数为\(k\)的方案数,每一次转移枚举再选\(x\)个数即可,贡献是\({cnt[i]+x-1,x-1}\)。最后注意第一个数不能为\(0\)。
Luogu4492 [HAOI2018]苹果树
发现长出第\(i\)个节点时有\(i\)种选择,所以最后总形态数就是\(N!\),所以就是求所有树的不便度之和。考虑对于每条边计算对总答案的贡献,若子树大小为\(j\),贡献即为\(j(n-j)\)。那么一共计算了多少次呢?设当前子树根节点为第\(i\)个节点,那么前\(i\)个节点的形态有\(i!\)种,子树内部形态有\(j!\)中,剩下的\(n-i-j+1\)个节点的形态有\(\prod_{k=i-1}^{n-j-1} k\)种,然后子树内的节点编号有\({n-i \choose j}\)种,所以总贡献是\(j(n-j)i!j!{n-i \choose j}\prod_{k=i-1}^{n-j-1}k\),即\(ij(n-j)!j!{n-i \choose j}\)。最后枚举\(i\),\(j\)求和即可。
Luogu4916 魔力环
LOJ6502「雅礼集训 2018 Day4」Divide
考虑重新构造数列,使对于数列中的每一个\(i\),都有\(w[i]+w[j] \geq m或w[i]+w[j] \lt m(1 \leq j \lt i)\)成立,那么就可以方便地用dp转移求得答案。现在考虑如何构造数列,先按\(w\)的大小排序,发现对于区间\([l,r]\),若\(w[l]+w[r] \leq m\)成立,那么\(w[t]+w[r] \leq m\)恒成立;若\(w[l]+w[r] \gt m\)成立,那么\(w[l]+w[t] \gt m\)恒成立;那么从\([1,n]\)开始,每一次取出相应的\(w[l]\)或\(w[r]\),就可以得到满足条件的数列。
LOJ6503「雅礼集训 2018 Day4」Magic
直接算不好算,考虑给所有卡片编号,最后答案再除以\(\prod_{i=1}^{m} a_i!\)即可。那么\(k\)个魔术队相当于在\(n\)张牌中选出\(k\)张牌,再将其插入到其他颜色与其相同的牌后。那么我们无法保证其他牌不形成魔术对,所以考虑容斥。设\(f(k)\)表示恰好\(k\)张牌形成魔术对的方案数,\(g(k)\)表示至少\(k\)张牌形成魔术对的方案数。那么有:\(f(k)=\sum_{i=k}^{n-1} (-1)^{i-k} {i \choose k}g(i)\)。如何计算\(g(i)\)呢?考虑dp。设\(f(i,j)\)表示考虑到第\(i\)种颜色,之前已经选出了\(j\)张牌构成魔术对,转移就枚举在第\(i\)种颜色中选出\(x\)张牌。贡献是多少呢?就是选出\(x\)张\({a_i \choose x}\),再将\(x\)张牌插入到其他牌后面\(\prod_{j=a_i-x}^{a_i-1}j\),所以是\({a_i \choose x}\prod_{j=a_i-x}^{a_i-1}j\)。最后因为其他牌未计入顺序,所以\(g(i)=f(m,i) \times (n-i)!\)。但是这样复杂度没有保证,因为每一次的转移实际是\(F_{i-1}(x)\)与贡献函数\(W_i(x)\)卷积得到新的\(F_i(x)\),所以可以用多项式优化。注意这里要用堆维护当前所有多项式的长度,每一次选出最短的两个做卷积即可,复杂度相当于分治,是\(O(nlog^{2}n)\)。