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题

posted @ 2019-09-11 19:57  FST_stay_night  阅读(342)  评论(0编辑  收藏  举报