毒假强
二分答案,统计 \(\le n\) 的有多少个 \(c=10^k-1\) 的倍数的十进制表示下不含有 \(9\)。
\(c\) 的倍数的条件是将 \(x\) 从低到高每 \(k\) 位分成一段(最后一段不够就当高位是 \(0\))得到的每一段的和是 \(c\) 的倍数。由于段数非常有限,于是可以枚举倍数(每段数值之和)的值。
由于最终每段的总和为定值,于是数位 \(\rm DP\)。按照常规操作枚举 \(\rm LCP\) 并钦定之后的一位小于 \(n\) 的对应位。设 \(f_{i,b}\) 表示考虑长度为 \(K\) 的段的前 \(i\) 位,之前的位对这位及以后造成的进位大小为 \(b\) 的方案数。
从 \(f_{i,*}\) 向 \(f_{i+1,*}\) 的转移可以枚举每个段中这一位选择的数值记录到进位中,被限制的位不能自由选数。枚举完每位的选择之后 \(f_{i,*}\) 要向 \(f_{i+1,*}\) 统一转移,只能转移十进制下尾数和 总和 的当前位相同的那些状态
赌徒
能作为硬币的某一面出现的数字一定是出现过的数字或者 \(1\)。每一面朝上时能给 \(A\) 带来的收益是固定的,可以将每个硬币拆成两个,每个都带 \(x_i\) 的收益。将数字从小到大排序之后做前缀和
剩下的工作是最大化 \(s_x+s_y-v_xv_y\),斜率优化。
零和
大样例告诉我们选择的正数集合可以固定。甚至可以直接把大样例给出的正数集合拖到 Submission 上。剩下的选负数,尝试每个为零子集都只有一个负数,也就是说每个负数都是 \([\frac{\sum a}2,\sum a]\) 中的数字
背包计算 \([0,\sum a]\) 每个数字能被多少子集凑成。再背包计算使用最少负数使得为零子集数量为 \(i\in[0,10^6]\) 的方案(记录转移路径)
题解说任选一个长度为 \(22\) 的 \(a_i\in[1,5]\) 的正数序列都可以凑出合法方案,不会证明。