0801-0804训练记录

这几天做了几道codechef上的题

白天听冬令营,晚上练2道题

0801

A是 Codechef April Challenge 2018 Chef at the Food Fair

发现是\(p_i*=x\) 但是却要求\((1-p_i)\)的积不太好做

于是看到乘积形式果断取\(ln\)转成维护区间和最后\(exp\)回去

发现\(ln(1-x)=-\sum_{i=1}^{\infty}\frac{x^i}{i}\)

再发现\(p<=0.9\)

于是只需要维护前\(100\)项即可

时间复杂度是\(O(100nlogn)\)

B是 Codechef July Challenge 2020 Weird Product

发现这个\(x\)的幂次是随下标逐渐\(+1\)果断考虑前缀和

记\(sum_i=\sum_{j=1}^{i}a_j*x^j\)

于是\(w(l,r)=x^{-2*l}*(sum_r-sum_{l-1})\)

于是只需要求\(\prod_{i=1}^n \prod_{j=i}^n -(sum_j-sum_{i-1})*(sum_{i-1}-sum_j)\)

即只需要求\(\prod_{i=0}^n \prod_{j!=i}(sum_i-sum_j)\)

记\(f(x)=\prod_{i=0}^n(x-sum_i)\)

于是对于每一个\(i\)我们就是求\(\frac{f(x)}{x-sum_i}\)在\(x=sum_i\)处的点值

用一下洛必达法则我们发现其实就是求

\(f'(x)\)在\(sum_0\)到\(sum_n\)处的点值

写一个多项式多点求值即可

时间复杂度是\(O(nlog^2n)\)

0802

A是Codechef July Challenge 2020 Expected Repetitions

p是整个串的贡献最后加上去

发现两个前缀\(i\)和\(j(i<j)\)的贡献为\((j-i)*lcs(i,j)\)

于是直接后缀树上线段树合并维护一下答案就好了

类似的有一个SA+CDQ+单调栈的做法

但由于前几天写过类似的题就写的SAM的做法

时间复杂度是\(O(nlogn)\)

B是Codechef July Challenge 2020 Expected Spanning Trees

不难发现可以对每棵生成树分开计算

看到操作序列考虑EGF

不难发现一条在原图中出现的边最后在原图中依然出现的EGF是

\(\sum_{i=0}^{\infty}\frac {x^{2i}} {i!}=\frac{e^x+e^{-x}}{2}\)

同样的一条不在原图中出现的边最后在原图中出现的EGF是

\(\sum_{i=0}^{\infty}\frac {x^{2i+1}} {i!}=\frac{e^x-e^{-x}}{2}\)

于是只需要对于\(i\)从\(0\)到\(n-1\)统计一下有\(i\)条边在原图中出现的生成树个数

这个是常见套路变元矩阵树+高斯消元\(O(n^4)\)解决

于是对于所有有\(i\)条边在原图中出现过的生成树他们的贡献是相同的

生成函数是\([\frac{e^x+e^{-x}}{2}]^{i} [\frac{e^x-e^{-x}}{2}]^{n-1-i}\)

类似「ZJOI2019」开关 的做法

我们把它写成\(\sum_{i}a_i*e^{ix}\)的形式

把\(n\)个式子乘上生成树个数合并起来

每次询问对每个\(e^{ix}\)次方快速幂一下算贡献

我们得到了\(O(n^4+nqlogmod)\)的做法

但这样太慢了好像过不了怎么办(其实能过)

光速幂!

时间复杂度降为\(O(n^4+n(\sqrt{mod}+q))\)

0803

上一篇:MySql必知必会


下一篇:Luogu5221 Product