2020寒假训练营4

本文介绍了四个算法问题的解决方案,涉及斐波那契数列、括号序列合法性判断、子段乘积最大值计算以及子段异或计数。通过欧几里得算法的变形探讨了斐波那契数列的性质,使用栈处理括号匹配,利用线段树和尺取法解决乘积最大值问题,以及通过异或前缀和计算子段异或为零的子段数量。
摘要由CSDN通过智能技术生成

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段的异或和,所以可以把异或前缀和统计出来,再排序,对每个数计算左右都相同的数量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值