真是个码农题……
由于是乘,所以没法用单调栈来统计答案贡献。
考虑分治套路,于是问题变成了求区间左端点 ,区间右端点 的答案。
由于最值的单调性,我们可以多维护两个指针使得每层递归只需 。
具体地说,我们按 顺序枚举 ,并同时维护满足 的最大的 和满足 的最大的 。
于是我们就可以把计算 对 的贡献分成三个部分,这里我们假设 ,反过来类似: 1. ,这一段的最值与 相同。 2. ,这一段仅最小值与 相同。 3. 这一段的最值与 不同。
于是我们可以在递归进入时维护五个量: 1. 2. 3. 4. 5.
通过这五个量,三个部分的贡献就容易得出了。
此外,注意取模时,应该把较大的数先取模再乘。
代码:
1 |
|









































