題目鏈接:
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)的復雜度了。