Loading

loj做题记录

「SDOI2017」数字表格

题目要求\(\prod_{i=1}^{n}\prod_{j=1}^{m}f(\gcd(i,j))\),核心思路是利用恒等式\([n=1]=\sum\limits_{d|n}\mu(n)\)对原式进行化简:

\[\begin{align*} \prod_{i=1}^{n}\prod_{j=1}^{m}f(\gcd(i,j))&=\prod_{d=1}^{n}f(d)^{\sum\limits_{i=1}^{n/d}\;\sum\limits_{j=1}^{m/d}[\gcd(i,j)=1]}\\ &=\prod_{d=1}^{n}f(d)^{\sum\limits_{g=1}^{n/d}\;\mu(g)\lfloor\frac{n}{dg}\rfloor\lfloor\frac{m}{dg}\rfloor}\\ &=\prod_{T=1}(\prod_{d|T}f(d)^{\mu(\frac{T}{d})})^{\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor} \end{align*} \]

可以在\(\Omicron(n\ln n)\)的时间复杂度内算出\(\prod_{d|T}f(d)^{\mu(\frac{T}{d})}\)的前缀积,然后整除分块统计即可,总时间复杂度\(\Omicron(n\ln n+T\sqrt{n}\log n)\).

「SDOI2017」相关分析

首先展开所求式子:

\[\begin{align*}a=\frac{\sum\limits_{i=L}^{R}(x_{i}-\overline{x})(y_i-\overline y)}{\sum\limits_{i=L}^R(x_i-\overline x)^2}&=\frac{\sum\limits_{i=L}^{R}x_iy_i-x_i\overline x-y_i\overline y+\overline x\times\overline y}{\sum\limits_{i=L}^R {x_i}^2-2x_i\overline x+{\overline x}^2}\\&=\frac{\sum\limits_{i=L}^{R}x_iy_i-\overline x\sum\limits_{i=L}^{R}x_i-\overline y\sum\limits_{i=L}^{R}y_i+\overline x\times\overline y\times(R-L+1)}{\sum\limits_{i=L}^{R}{x_i}^2-2\overline x\sum\limits_{i=L}^{R}x_i+{\overline x}^2\times(R-L+1)}\\&=\frac{\sum\limits_{i=L}^{R}x_iy_i-\overline x\sum\limits_{i=L}^{R}x_i-\overline y\sum\limits_{i=L}^{R}y_i+\overline x\times\overline y\times(R-L+1)}{\sum\limits_{i=L}^{R}{x_i}^2-2\overline x\sum\limits_{i=L}^{R}x_i+{\overline x}^2\times(R-L+1)}\end{align*} \]

考虑维护\(x_iy_i,{x_i}^2,x_i,y_i\)四个量的区间和,其中后两个量用线段树很好维护。

考虑如何维护\({x_i}^2\),假设现在\(x_i\)增加了\(k\)

\[\begin{align*}(x_i+k)^2-{x_i}^2&={x_i}^2+2x_ik+k^2-{x_i}^2\\&=2x_ik+k^2\end{align*} \]

每次对于一个区间加\(k\)的操作,只需将\({x_i}^2\)加上\(2k\sum_{i=L}^{R}x_i+k^2\times(R-L+1)\)即可。

我们再来维护\(x_iy_i\)

\[(x_i+k)y_i-x_iy_i=x_iy_i+ky_i-x_iy_i=ky_i\\x_i(y_i+k)-x_iy_i=x_iy_i+kx_i-x_iy_i=kx_i \]

打懒标记记录当前的\(x_iy_i\)分别要加的\(x_i,y_i\)的系数即可。

时间复杂度\(\Omicron((n+m)\log n)\).

好吧我漏看了3操作,这题确实是shit题

等我A几个水题回头再来收拾它

「AHOI / HNOI2017」礼物

首先将式子展开:

\[\sum_{i=1}^n(x_i-y_i)^2=\sum_{i=1}^{n}{x_i}^2-2x_iy_i+{y_i}^2 \]

现在考虑将\(x_i\)加上\(c\)之后的变化:

\[\begin{align*}&\sum_{i=1}^{n}{(x_i+c)}^2-2(x_i+c)y_i+{y_i}^2-({x_i}^2-2x_iy_i+{y_i}^2)\\=&\sum_{i=1}^n2c(x_i-y_i)+c^2\end{align*} \]

不难看出无论如何旋转手环,加上\(c\)的增量相同,并且这是一个开口向上的二次函数,所以\(f(c)_{min}=f(\frac{\sum\limits_{i=1}^{n}y_i-x_i}{n})\).

然后我们考虑如何处理旋转,首先不管如何旋转,\(\sum\limits_{i=1}^{n}{x_i}^2+{y_i}^2\)都是定值,单独统计就好,然后发现\(x_i\)和对应的\(y_i\)下标之差都是相同的,所以把\(y_i\)翻转一下,对应下标之和相同,这让我们联想到了卷积,由于是环状结构,所以再将\(y_i\)复制一份,破环成链即可,最后变成了如下形式:

\[f(d)=\sum_{i=0}^{n-1}x_iy_{2n-i-d-1},d\in[n,2n-1] \]

所以将处理后的\(x_i\)\(y_i\)直接卷起来,然后取\(f(d)\)的最大值即可。

使用一次\(\operatorname{FFT}\)即可快速统计出答案,时间复杂度\(\Omicron(n\log n)\).

posted @ 2020-12-11 21:12  SmilingKnight  阅读(190)  评论(0)    收藏  举报