youwiki大佬的博文
根号分治
CF797E Array Queries
我们考虑,按 \(k > \sqrt{n}\) 和 \(k \leq \sqrt{n}\) 分类讨论。
如果 \(k > \sqrt{n}\) , 那么暴力就可以了。
如果 \(k \leq \sqrt{n}\) , 那么可以预处理 \((p, k)\) 状态需要跳的步数。
CF1580C Train Maintenance
有 \(n\) 种列车,第 \(i\) 种列车每工作 \(x_i\) 天就要维护 \(y_i\) 天。
接下来的 \(m\) 天中,每天有一个操作,分为加入一列车和删除一列车。在车刚加入的那一天,它刚维修完,即加进来的那天可以正常工作。
每一天的操作完成后,你都要回答,当前有多少车在维修?
\(1\le n,m\le 2\times 10^5\)。
\(1\le x_i,y_i\le 10^9\)。
对 \(x_i + y_i\) 进行根号分治. 分为两类
1> \(x_i + y_i \leq \sqrt{m}\)
因为 \(x_i + y_i \leq \sqrt{m}\), 所以这样的 \(x_i + y_i\) 最多有 \(\sqrt{m}\) 种 (废话😒) , 然后对于每一个 \(x_k + y_k\) 维护一个线性表 (可以支持 \(O(1)\) 的单点修改和查询) \(a[i][j]\), 用来维护 \(x_k + y_k = i\) 的火车对模 \(i\) 为 \(j\) 的时刻的贡献, 每加入或删除一个火车时可以直接暴力修改,查询时直接暴力统计每个线性表。
2> \(x_i + y_i > \sqrt{m}\)
注意每次询问的时刻是一天一天的递增的, 所以可以用差分。
因为 \(x_i + y_i > \sqrt{m}\) 所以火车维修的时间段数 \(< \sqrt{m}\) , 然后用差分进行修改就行了。
我个人认为在 OI 中,组合计数是最简单、公式化的版块。同时解决计数题也是最有成就感的。
计数的话,除了之前讲过的计数dp, 还要考虑组合意义,推式子,或者直接套用已有的套路来转化原问题。
回顾十二重计数法
寒假集训,我们讲过十二重计数法,那么现在请大家回顾一下
https://www.luogu.com.cn/problem/P5824
回顾一些组合恒等式
CF932E Team Work
给定 \(n, k\), 求 :
\(1 \leq k \leq 5000, 1 \leq n \leq 10^9\)
CF869C The Intriguing Obsession
齐心协力,我们可以以超乎想象的速度到达任何地方!现在,火炎姐妹 (Fire Sisters) —— 火怜 (Karen) 和月火 (Tsukihi) 正在前往一个她们从未到达的地方——水中的小岛!
有三种不同类型的小岛,方便地,各自涂上了红,蓝,紫三色。每种颜色的小岛各自有 \(a,b,c\) 个。
这些小岛之间初始时互相分离。可以在小岛之间架桥,两个小岛间最多架一座桥。
但要满足:任意两个不同的颜色相同的小岛的最短距离要大于等于 \(3\)(桥的长度为 \(1\))。
火炎姐妹已经准备好迎接未知了,但是她们想测试一下你的勇气。你需要计算出不同的架桥方案有多少种,如果有两个小岛之间造桥的方案变了,我们就说这两个造桥的方案不同。答案对 \(998244353\) 取模。
很简单的一道题。
我先把限制转化一下,其实就是,相同颜色不能有连边,一个岛不能同时与两个颜色相同的岛相连。
这个问题就很好解决了。
考虑分配贡献
给你一个长度为 \(n\) 的序列 \(a\) , 让你求 \(a\) 的所有上升子序列的元素和。
\(1 \leq n \leq 10^5\)
格路计数普及
给你 \(n \times m\) 的网格,你从左下角出发,每次可以向上走,也可以向右走,有一条线为 \(y =x+b\) , 问你有多少种方案不经过这条线走到右上角。
lucas 定理
AT_arc137_d [ARC137D] Prefix XORs
给定一个长度为 \(N\) 的整数序列 \(A=(A_1,A_2,\cdots,A_N)\),以及一个整数 \(M\)。
对于每个 \(k=1,2,\cdots,M\),请你求出对 \(A\) 恰好进行 \(k\) 次如下操作后 \(A_N\) 的值。
- 对于所有 \(i\)(\(1\leq i\leq N\)),将 \(A_i\) 的值替换为 \(A_1\oplus A_2\oplus \cdots\oplus A_i\)。这个替换对所有 \(i\) 同时进行。
这里,\(\oplus\) 表示按位异或(bitwise XOR)运算。
\(1 \leq N \leq 10^6 , 1 \leq M \leq 10^6,0 \leq A_i < 2^30\)
-
对序列 \(A\) 做 \(m\) 次前缀和后得到序列 \(A^m\), 有 \(A^m_n = \sum_{k=1}^{n} \binom{m-1+n-k}{m-1}A_k\) , 可以由格路计数得到证明.
-
由 lucas 定理得,\(\binom{n}{m}\) 是奇数当且仅当在二进制下 \(\forall i, m_i \leq n_i\).
P6521 [CEOI 2010] pin (day2)
给定 \(n\) 个长度为 \(4\) 的字符串,你需要找出有多少对字符串满足恰好 \(D\) 个对应位置的字符不同。
\(2 \leq n \leq 5 \times 10^4, 1 \leq d \leq 4\)
所有输入的字符串没有重复。
我们容斥一下,把原来的问题转化成恰好 \(4-D\) 个位置相同。然后转化成钦定以后容斥就好了。
P3349 [ZJOI2016] 小星星
小 Y 是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品。她有 \(n\) 颗小星星,用 \(m\) 条彩色的细线串了起来,每条细线连着两颗小星星。
有一天她发现,她的饰品被破坏了,很多细线都被拆掉了。这个饰品只剩下了 \(n-1\) 条细线,但通过这些细线,这颗小星星还是被串在一起,也就是这些小星星通过这些细线形成了树。小 Y 找到了这个饰品的设计图纸,她想知道现在饰品中的小星星对应着原来图纸上的哪些小星星。如果现在饰品中两颗小星星有细线相连,那么要求对应的小星星原来的图纸上也有细线相连。小 Y 想知道有多少种可能的对应方式。
只有你告诉了她正确的答案,她才会把小饰品做为礼物送给你呢。
\(n \leq 17, m \leq \frac{1}{2}n(n-1)\)
暴力的做法是定义状态f[i][j][S]表示节点i编号为j,i的子树内的编号集合为S的方案数。
但是这样的瓶颈在于枚举子集,复杂度是 \(O(n^3\times 3^n)\)
尝试把「编号是一个1到n的排列」这一条件去掉,就不用记录S了。
这样只需要定义f[i][j]为在i的子树内,点i的编号为j的方案数。
而这时候会出现重复编号,怎么办呢?
我们可以容斥,\(2^n\) 枚举子集 \(S\) , 强制规定树上每个点的编号必须是S的子集 , 然后每次 \(O(n^3)\) 一次DP.
二项式反演
P5505 [JSOI2011] 分特产
https://www.luogu.com.cn/problem/P5505
我们要求恰好 \(0\) 个同学没有分到特产的方案数
我们设 \(f_i\) 表示钦定 \(i\) 个同学没有分到特产。
那么有 \(f_i = \binom{n}{i}\prod_{j=1}^{m}\binom{a_j + n - i - 1}{n - i - 1}\)
然后我们用二项式反演就可以了

浙公网安备 33010602011771号