注:本人模拟省选 A A A 卷。
前记
一场英语模拟期末直接萎掉之后心境垂垂暮老,然后来模拟省选增强一点信心。实际却不大行
本来立的目标是口头 200 200 200 的,看完题发现 150 150 150 的目标比较合适。
组合数问题
先开 T 2 T2 T2 的主要原因:觉得自己数论强。没了。
∑ k = 0 n f i × x k × C n k \sum_{k=0}^n f_i \times x^k \times C_n^k k=0∑nfi×xk×Cnk
其中 f = ∑ i = 0 m a i ⋅ k i f = \sum_{i=0}^m a_i \cdot k^i f=∑i=0mai⋅ki
算法一
暴力。 f i f_i fi 用 O ( m ) \mathcal{O}(m) O(m) 的时间计算, C n k C_n^k Cnk 用杨辉三角, x k x^k xk 递推。
时间复杂度: O ( n m ) \mathcal{O}(nm) O(nm).
实际得分: 15 p t s 15pts 15pts.
算法二
注意到, m = 0 m=0 m=0 有部分分。
因此考虑, m = 0 m=0 m=0 时,即多项式降为常数项,如何通过 n ≤ 1 0 5 , 1 0 9 n \leq 10^5 , 10^9 n≤105,109 的数据?
显然,原式就变成了
∑ k = 0 n a 0 × x k × C n k \sum_{k=0}^n a_0 \times x_k \times C_n^k k=0∑na0×xk×Cnk
= a 0 × ∑ i = 0 n x i ⋅ C n i = a_0\times \sum_{i=0}^n x^i \cdot C_n^i =a0×i=0∑nxi⋅Cni
你懵了,一看,唉?
n ≤ 1 0 5 n \leq 10^5 n≤105, p p p 还是质数?
那爷直接大力 Lucas O ( n log n ) \texttt{Lucas} \space \mathcal{O}(n \log n) Lucas O(nlogn) 过掉呗。
那 n ≤ 1 0 9 n \leq 10^9 n≤109 呢?你再看看这个式子 ⋯ \cdots ⋯
等一下,哎?这怎么那么像什么公式呢?
翻出 二项式定理 的小本本,我们发现:
( x + 1 ) n = ∑ i = 0 n x i ⋅ C n i (x+1)^n = \sum_{i=0}^n x_i \cdot C_n^i (x+1)n=i=0∑nxi⋅Cni
诚然不会二项式的弱也就算了吧
显然, a 0 × ( x + 1 ) n a_0 \times (x+1)^n a0×(x+1)n 是个人都会算。
时间复杂度: O ( log n ) \mathcal{O}(\log n) O(logn).
实际得分: 40 p t s 40pts 40pts.
算法三
实际上,本人想不出, m ≤ 5 m \leq 5 m≤5 有什么特殊的性质。
听说正解是 第二类斯特林数 可是我模板都不会,告辞~
冰火战士
结果 T 2 40 p t s T2 \space 40pts T2 40pts 是个好的预兆, T 1 T1 T1 一开发现貌似是个二分。
首先, O ( Q log x ) ≈ 6.2 × 1 0 7 \mathcal{O}(Q \log x) \thickapprox 6.2 \times 10^7 O(Qlogx)≈6.2×107 ,不是个好的复杂度。
其次,这玩意儿有单调性吗?自己想一下,嗯
⋯
\cdots
⋯ 当它有吧。 你告诉我考场上也这么猜呗
直接告诉我我能 A \text{A} A,所以直接想正解。
首先我们可以用
vector<pair>
\texttt{vector<pair>}
vector<pair> 来维护双方战士。好像 bitset
也行,但毕竟是模拟考啊,自己不熟的还是不要用吧。
然后 vector \texttt{vector} vector 的常数本身就很悬,加上上次机房的一个大佬信誓旦旦地和老师辩论说
vector 插入删除很多个数会直接爆栈,要去找内存
找内存 = ?
不管,考场策略。再说就算 T \text{T} T 也不怕,反正不是正式考?
那问题来了,你
log
\log
log 二分挂在哪儿,总不能
O
(
Q
)
\mathcal{O}(Q)
O(Q) 验证吧?那才 30 分好吧
算了一下,自己 T 2 \text{T}2 T2 调试了 1.5 h 1.5h 1.5h,那正式考场还有 4 h 4h 4h 肯定,肯定能写到 30 30 30.
T3
为了表现本人对此题的足够不重视,连题目名字也一律去掉了。
显然 15 15 15 分手到擒来,因为正式考试会有足够时间调试,我也有这个信心。
Day1 \text{Day1} Day1
以上, 30 + 40 + 15 = 85 30+40+15 = 85 30+40+15=85 开幕雷击。
信号传递
毕竟是初一,唉,省选还是弱,弱,弱。
一开题就想到了 O ( m ! ⋅ n ) \mathcal{O}(m \text{!} \cdot n) O(m!⋅n) 的算法。一看数据范围,就 30 30 30 分啊?
锤子吧?
好,这个数据很有梯度,是在误导我用 O ( 2 m ⋅ m ) \mathcal{O}(2^m \cdot m) O(2m⋅m) 的暴力?
首先,这个 30 30 30 的暴力再简单不过了。所有的数据聚焦在 20 + 20+ 20+ 只说明 O ( 2 m ⋅ m ) \mathcal{O}(2^m \cdot m) O(2m⋅m) 需要大力卡常, m = 23 m=23 m=23 的时候达到了将近 2 × 1 0 8 2 \times 10^8 2×108,有点悬。
说的好像我写出来了似的
分析一下,这可以说明, O ( n ) \mathcal{O}(n) O(n) 的验证不科学。
我们可以把每两个信号站的传递次数记录,然后用 O ( m 2 ) \mathcal{O}(m^2) O(m2) 的时间验证,继续暴力。
看似优了,实则 O ( m ! ⋅ m 2 ) \mathcal{O}(m! \cdot m^2) O(m!⋅m2) 还是过不了。
等一下,这个 4 × 1 0 8 4 \times 10^8 4×108 的卡常可以试一试,毕竟 LUOGU \texttt{LUOGU} LUOGU 的评测机不错,可惜没有冥间数据。要是能卡过就是 60 60 60 了。
毫不客气地, m = 21 m=21 m=21 显然这过不了了,几乎到了 1 0 9 10^9 109 级。
60 60 60 滚粗,没了。代码不写了。因为暴力全排的写法太简单,估计 1 h 1h 1h 就能轻松拿到 60 60 60.( Day1T2 \text{Day1T2} Day1T2 我 2 h 2h 2h 才 40 40 40,现在呢?)
等一下,我从梦里醒来了,我才发现自己写的是 O ( m ! ⋅ m 2 ) \mathcal{O}(m! \cdot m^2) O(m!⋅m2) 而不是 O ( 2 m ⋅ m 2 ) \mathcal{O}(2^m \cdot m^2) O(2m⋅m2).
所以还是 30 30 30 萎掉了啊。
树
一坨异或感觉不妙。上次 NOI ONLINE TG 3 \text{NOI ONLINE TG 3} NOI ONLINE TG 3 的异或我就是找周期瞎写结果 70 70 70 的,反正自己很讨厌异或!
我发现有 10 10 10 的暴力分, 20 20 20 的链分, 20 20 20 的权值 1 1 1 的分。
暴力分只需要 10 min 10 \text{min} 10min 就可以轻松到手。
权值 1 1 1 和 链 没有找到丝毫线索。
所以就这么点分呗?
链的话,对于 u u u,我需要计算 ( v 1 + 1 ) ⊕ ( v 2 + 2 ) ⊕ ⋯ ⊕ ( v t + 3 ) (v_1+1)⊕(v_2+2)⊕ \cdots⊕(v_t+3) (v1+1)⊕(v2+2)⊕⋯⊕(vt+3) ( v v v 为子树集合),那么显然这玩意儿算不了。等一下 ⋯ ⋯ \cdots \cdots ⋯⋯ 为什么不用 Trie \text{Trie} Trie 树试着维护呢?我觉得可以试试。
不过这里不大行啊。
权值为 1 1 1 的话, Trie \text{Trie} Trie 是可以试试的。毕竟,求距离 + 1 +1 +1 的异或值么,异或可以用 Trie \text{Trie} Trie 维护,没了。
那怎么维护呢?假设对于
u
u
u 建立儿子节点集合(非子树集合)
v
v
v,考虑从
v
→
u
v \rightarrow u
v→u 怎么搞?诚然,我们需要把当前
Trie
\text{Trie}
Trie 的值全体
+
1
+1
+1 (可以在词尾标记修改的,但是时间会炸裂),然后再合并。可能是本人比较菜罢
再见, 10 10 10 分。
作业题
怀着 125 125 125 分的渣成绩,寄希望于最后一题。
显然就算我 A 掉这道题也进不了队的
感觉暴力分挺多,不慌,爷的目标 150 150 150 估摸着可以试一试的。
首先, O ( C m n − 1 log w ) \mathcal{O}(C_m^{n-1} \log w) O(Cmn−1logw) 稳稳地过掉了 10 10 10 分。
估摸着生成树应该没有那么多吧。不要和 CCF 讲概率了
w i w_i wi 均相同?好性质啊,那 gcd \gcd gcd 恒为常数 是个好东西!
那么,这题显然弱化为:
求一个无向图所有生成树的边权之和。
就这?不会。
然后发现 m ≤ n m \leq n m≤n,然后连通 ⋯ \cdots ⋯ 说明一点:这是棵树(基环树)!
显然对于一棵树,它的生成树个数只有 1 1 1 个,它自己,瞎求就行了。
对于 基环树,显然,生成树个数是环的长度,这是破环为链的一个思想。
我们可以求出环外的 ∑ \sum ∑ 和 gcd \gcd gcd,然后稳稳地枚举环。
哈哈!那爷不就
30
30
30 了 激动啥
至少 155 155 155 目标达成了,耶!
显然, w i w_i wi 均为质数是 w i w_i wi 均相同的加强版,所以考虑,如何求出一个图所有生成树的边权之和。
大力枚举大概 n ≤ 30 n \leq 30 n≤30 是过不了的耶!再见。
总结
作为场外初一模拟省选,没有条件用 9 h 9h 9h 的时间模拟考试,只用 2 h 2h 2h 的时间写了 Day1 T1,2 \text{Day1 T1,2} Day1 T1,2 并初步看了其它题的思路。
显然这次 155 155 155 离进队还是很远的( 1 2 \frac{1}{2} 21 进队吧?),但是暴力分拿满了,没什么遗憾的了。
今番良晤,豪兴不浅,他日江湖相逢,再当杯酒言欢。咱们就此别过。江湖路远,各位请一路珍重。