2020寒假训练营4
A.欧几里得 如果已知 gcd(a,b) 共递归了 n次,求所有可能的a,b中满足a>b>=0且a+b最小的一组的a与b之和
打表发现是个斐波那契数列,直接输出即可
B.括号序列 给出一个仅包含’[’,’]’,’(’,’)’,’{’,’}'六种字符的括号序列,判断其是否合法
三个括号可以用栈来做,遇到左括号入栈,遇到对应的有括号则出栈,最后栈若为空则合法,其他情况不合法。
C.子段乘积 给出一个长度为 n 的数列,求其长度为 k 的连续子段的乘积对 998244353 取模余数的最大值
可以直接用线段树来做,将对区间的查询改为乘,此种方法较为便捷。
也可以用尺取加逆元来做,具体来说,若当前a[r]的值不为0,则连续乘k段,与存储的最大值作比较取最大,在指针移动时要注意,原本要求sum/a[r]的,但要用逆元求,即sum=sum*qpow(sum,mod-2)%mod;之后再进行指针的移动。若a[r] = 0,则跳过当前区间,并将sum置为1。
D.子段异或 输入一个数列a,你需要输出其中异或值为0的不同子段的数量
由异或的性质,abb=a,异或两次值不变。所以[l,r]区间的异或值为前r段的异或和异或前l-1段的异或和,所以可以把异或前缀和统计出来,再排序,对每个数计算左右都相同的数量。