题目链接:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3982
我们要求的就是x * y-1 % P
y = catalan( n ) % P
主要说说x怎么求:
对于一个长度为2n的序列,如果我们在这2n个数前面选择n个放+,n个放-,并且+-号的放置方式满足卡特兰序列,即满足所有前缀的+号个数 >= -号个数,我们记放置符号后的2n个数的和为S。
这x = catalan(n)种放置方式的S的和。
我们可以转化为对2n个位置求贡献。
对于第i个位置a[i],前面为+的方案数为f(i),则前面为-的方案数为catalan(n) - f(i),
对x的贡献:f(i) * a[i] - (catalan(n) - f(i)) * a[i]
问题是f(i)不会求,到stackoverflow上面也没有查到。
那就把+-号改为()括号,每次算的是2个位置组成一对的贡献a[r] - a[l]。
枚举长度len,再枚举(括号位置l,则r = l + len - 1,然后推推x的公式,
发现不用枚举l了,因为变成了前缀和。
所以x的公式就是枚举长度O(n)的复杂度了。