A
位数和为(4)的倍数,涉及到进位,直接把最近的(30)个判断一下就好了
B
最大的可能的为:最小值(+k),如果最大值能(≤)该值则成立,否则输出(-1)
C
先全部选(b),看是否能为正,在考虑正的这部分去选(a),就等于补掉多少个(a-b)
D
有一个明显的坑点就是不能整体赋值,大部分(t)掉的都是这个原因
我们统计每种颜色的个数,排好序后单独扔进一个数组,考虑从大到小遍历,每次优先取满足条件的最大值
具体实现就是拿一个指针记录能选的最大值,如果遍历到的值刚好为指针则选择,指针左移;如果大于指针,也选指针;如果小于的话,选该值,将指针赋为该值(-1)
E/H
用(lst_i)表示该字符上一次出现的位置;用(f_{i,j})表示前(i)个字符,长度为(j)的互异的个数
-
(lst_i=0),说明该字符第一次出现,(f_{i,j}=f_{i-1,j}+f_{i-1,j-1},++f_{i,1})
-
(lst_i≠1),说明前面出现过该字符了,我们得考虑容斥,显然(lst_i)前面与其组成子序列的前缀也能与(i)组成相同的子序列,(f_{i,j}=f_{i-1,j}+f_{i-1,j-1}-f_{lst_i-1,j-1})
(f)数组成指数级增长,而(k)有限,故限制(f)不超过(k)
每次优先选取最长的子序列,直接统计答案就好了
F
最难的题,用贪心,每次选取最大值,然后除掉因子去选
但我们发现能构造出(hack)的数据,比如(6,10,15,30),这是因为(frac{1}{5}+frac{1}{3}+frac{1}{2}>1),特判一下这种情况就好了