HYNB Contest 7:2017 Asia HCMC Vietnam National Programming Contest
A. Another Query on Array Problem
B. Board Covering
C. Cumulative Sums
题意
- \(A_1=1,A_i=A_{i-1}+sod(A_{i-1}),sod(X)\)为\(X\)的十进制数位和
- \(S_n=\sum_{i=1}^{n}A_i\),求\(S_n\)模\(10^9+7\),\(n≤10^{15}\)
做法
- 先考虑怎么求\(A_n\)的值
- 初步想法:把\(A_i\)拆成高位和低位,设高位为\(X\),固定高位,那么对低位的影响就是每次多加了个\(sod(X)\),直到加到对高位有进位时,\(sod(X)\)发生了改变。可以把低位调大点使得每次只会向高位进位一个1,因为\(sod(X)\)很小,所以可以dp出所有状态,即\(dp[i][j]\)表示低位为\(i\),\(sod(X)\)为\(j\),一直加到向高位进位为止转移的次数以及进位之后的低位是哪个数。这样高位可以O(1)转移了,然而这样复杂度还是非常高。
- 比赛时思路就卡在了这里,认为如果继续对高位再拆分成若干段的话,那么对于每一段,我需要dp的时候记录所有低位的值,那么状态数其实和不拆分是一样的,没什么卵用
- 其实分析一下就会发现,我们并不需要记录低位的所有可能的值,只需要记录刚进位之后低位的值就可以转移了呀,这样每一段状态数就很少了,为啥没想到。。。
- 于是直接把低3位划分成一段,其他每一位一段就好了,求和的话多记录个和就好了
D. Delicious Bubble Tea
签到
E. European Trip
做法
- 可以费马点。但不会。
- 三分套三分。
F. Familiar Digit
- 思路挺直接的一个经典的数位dp,但是调了比较久,有点蠢
G. Ginger Candy
做法
- 注意到数据范围。
- 只需考虑最小生成树权值前 2 小的非树边。
H. Nim Cheater
题意 n 堆石头,选择至多 n-2 堆石头,每堆石头弃置若干个,求 xor 等于 0 方案数。
做法
- 只需造轮子求满足 \(0\leq x_i\leq a_i\),xor 和为 k 的 x 序列方案数,就无敌了。抓着轮子求【总的方案数】-【都不相等的方案数】-【恰有一堆相等的方案数】即可。
- 怎么造轮子?
- 从高位到地位逐位考虑,当前在考虑第 B 位,考虑这位上为 1 的所有数字,如果某个数字在这位(第 B 位)设为了 0,那么其它数字的第 B-1 至第 0 位可以乱填,第 B 位乱填不得,我们来做个简单的 DP。
- \(f[i][0/1]\) 表示考虑确定下前 \(i\)个(第 B 位为 1的)数字,其中奇数/偶数个数字第 B 位填 1 的方案数。
- 第 B 位全填 1 是不可取的!因为至少得保证有一个填 0。
- 全填 1 递归到下一层解决。
I. Integer Rotation
J. Jewelry Box
做法 求导,求极值。
K. Keep the Parade Safe
- 求一下严格凸包,对严格凸包只有三个点的情况分类讨论
L. Let's Play Monopoly!
- 赛中:好难,不可做
- 赛后:怎么他们AC代码长度只有800?再好好想想!
- 自闭若干小时后:tmd读错题了吧!
- 重读了一遍题之后:题意没毛病啊?咋回事啊?
- 瞅了眼数据范围:\(u_i<v_i\),没环,SB题