类欧几里得算法&洛谷P5170题解

类欧几里得算法&洛谷P5170题解

好久没更博客了说,不能这样颓废了(flag

Problem

给定\(n,a,b,c\),求\(f(a,b,c,n)=\sum\limits_{i=0}^n\lfloor\frac{ai+b}c\rfloor,g(a,b,c,n)=\sum\limits_{i=0}^n\lfloor\frac{ai+b}c\rfloor^2,h(a,b,c,n)=\sum\limits_{i=0}^ni\lfloor\frac{ai+b}c\rfloor\)

Algorithm

先考虑看上去最可做的第一个柿子。

首先可以通过一些trivial的讨论把\(a,b\)\(c\)取模。

\[ \begin{align} f(a,b,c,n)&=\sum\limits_{i=0}^n\lfloor\frac{ai+b}c\rfloor\\ &=\sum\limits_{i=0}^n\lfloor\frac{(a\%c)i+b\%c}c\rfloor+\frac{(n+1)*n}2\lfloor\frac ac\rfloor+(n+1)\lfloor\frac bc\rfloor\\ &=f(a\%c,b\%c,c,n)+\frac{(n+1)*n}2\lfloor\frac ac\rfloor+(n+1)\lfloor\frac bc\rfloor \end{align} \]
我们接下来考虑\(a,b<c\)的情况,考虑此时的\(\lfloor\frac{ai+b}c\rfloor\)取值不会超过\(n\),可以枚举取值。

\[ \begin{align} f(a,b,c,n) &=\sum\limits_{i=0}^n\lfloor\frac{ai+b}c\rfloor\\ &=\sum\limits_{i=0}^n\sum\limits_{d=1}^{\lfloor\frac{an+b}{c}\rfloor}[\lfloor\frac{ai+b}c\rfloor\ge d]\\ 两边大力乘上a^{-1}c &=\sum\limits_{i=0}^n\sum\limits_{d=1}^{\lfloor\frac{an+b}{c}\rfloor}[a^{-1}c\lfloor\frac{ai+b}c\rfloor\ge a^{-1}cd\gt a^{-1}(cd-1)]\\ &=\sum\limits_{i=0}^n\sum\limits_{d=1}^{\lfloor\frac{an+b}{c}\rfloor}[i\gt \frac{(cd-b-1)}a]\\ &=\sum\limits_{i=0}^n\sum\limits_{d=0}^{\lfloor\frac{an+b}{c}\rfloor-1}[i\gt \frac{(cd+c-b-1)}a]\\ &=\sum\limits_{d=0}^{\lfloor\frac{an+b}{c}\rfloor-1}(n-\lfloor\frac{(cd+c-b-1)}a\rfloor)\\ &=n\lfloor\frac{an+b}{c}\rfloor-\sum\limits_{d=0}^{\lfloor\frac{an+b}{c}\rfloor-1}\lfloor\frac{(cd+c-b-1)}a\rfloor\\ &=n\lfloor\frac{an+b}{c}\rfloor-f(c,c-b-1,a,\lfloor\frac{an+b}{c}\rfloor-1)\\ \end{align} \]
于是我们就可以在\(log(n)\)的渐进时间复杂度下求出\(f\)

好的,相信\(g,h\)不是问题。

于是我们看看\(g\)
\[ g(a,b,c,n)=\sum\limits_{i=0}^n\lfloor\frac{ai+b}c\rfloor^2 \]
套路一波。
\[ \begin{aligned} g(a,b,c,n)&=\sum\limits_{i=0}^n(\lfloor\frac{(a\%c)i+b\%c}c\rfloor+i\lfloor\frac ac\rfloor+\lfloor\frac bc\rfloor)^2\\ 大力展开,上式&=\sum\limits_{i=0}^n(\lfloor\frac{(a\%c)i+b\%c}c\rfloor^2+i^2\lfloor\frac ac\rfloor^2+\lfloor\frac bc\rfloor^2+2i\lfloor\frac ac\rfloor\lfloor\frac{(a\%c)i+b\%c}c\rfloor+2i\lfloor\frac bc\rfloor\lfloor\frac{(a\%c)i+b\%c}c\rfloor+2i\lfloor\frac ac\rfloor\lfloor\frac bc\rfloor)^2\\ 设S1(n)&=\sum\limits_{i=0}^ni=\frac{i*(i+1)}{2},S2(n)=\sum\limits_{i=0}^ni^2=\frac {i*(i+1)*(2i+1)}6\\ 整理,原式&=g(a\%c,b\%c,c,n)+S2(n)\lfloor\frac ac\rfloor^2+(n+1)\lfloor\frac bc\rfloor^2+2\lfloor\frac ac\rfloor h(a\%c,b\%c,c,n)+\lfloor\frac bc\rfloor f(a\%c,b\%c,c,n)+S1(n)\lfloor\frac ac\rfloor\lfloor\frac bc\rfloor \end{aligned} \]
你发现事情变得辣手了起来,我们似乎并不知道这个\(h\)怎么搞。

但是你先不管它,假设你知道了\(h\)怎么算。
\[ \begin{aligned} g(a,b,c,n)&=\sum\limits_{i=0}^n\lfloor\frac{ai+b}c\rfloor^2\\ &=\sum\limits_{i=0}^n(2\sum\limits_{d=1}^{\lfloor\frac{ai+b}c\rfloor}d-\lfloor\frac{ai+b}c\rfloor)\\ &=\sum\limits_{i=0}^n(2\sum\limits_{d=0}^{\lfloor\frac{ai+b}c\rfloor-1}(d+1)-\lfloor\frac{ai+b}c\rfloor)\\ &=2\sum_{d=0}^{\lfloor\frac {an+b}c\rfloor-1}(d+1)\sum\limits_{i=0}^n[\lfloor\frac{ai+b}c\rfloor\ge d+1]-f(a,b,c,n)\\ &=2\sum_{d=0}^{\lfloor\frac {an+b}c\rfloor-1}(d+1)(n-\lfloor\frac{cd+c-b-1}a\rfloor)-f(a,b,c,n)\\ &=n*\lfloor\frac {an+b}c\rfloor*(\lfloor\frac {an+b}c\rfloor+1)-2\sum_{d=0}^{\lfloor\frac {an+b}c\rfloor-1}(d+1)\lfloor\frac{cd+c-b-1}a\rfloor-f(a,b,c,n)\\ &=n*\lfloor\frac {an+b}c\rfloor*(\lfloor\frac {an+b}c\rfloor+1)-2h(c,c-b-1,a,\lfloor\frac{an+b}c\rfloor-1)-2f(c,c-b-1,a,\lfloor\frac{an+b}c\rfloor-1)-f(a,b,c,n)\\ \end{aligned} \]
我们最后考虑一下\(h\),首先大力展开
\[ \begin{aligned} h(a,b,c,n)=S2(n)\lfloor\frac ac\rfloor+S1(n)\lfloor\frac bc\rfloor+h(a\%c,b\%c,c,n) \end{aligned} \]
好的,继续
\[ \begin{aligned} h(a,b,c,n)&=\sum\limits_{i=0}^ni\lfloor\frac {ai+b}c\rfloor\\ &=\sum\limits_{i=0}^ni\sum\limits_{d=1}^{\lfloor\frac{an+b}{c}\rfloor}[a^{-1}c\lfloor\frac{ai+b}c\rfloor\ge a^{-1}cd\gt a^{-1}(cd-1)]\\ &=\sum\limits_{i=0}^ni\sum\limits_{d=0}^{\lfloor\frac{an+b}{c}\rfloor-1}[i\gt\frac{cd+c-b-1}{a}]\\ &=S1(n)\lfloor\frac {an+b}c\rfloor-\sum\limits_{d=0}^{\lfloor\frac{an+b}{c}\rfloor-1}\sum\limits_{i=0}^ni[\frac{cd+c-b-1}a\ge i]\\ &=S1(n)\lfloor\frac {an+b}c\rfloor-\sum\limits_{d=0}^{\lfloor\frac{an+b}{c}\rfloor-1}\frac{(\frac{cd+c-b-1}a)*(\frac{cd+c-b-1}a+1)}2\\ &=S1(n)\lfloor\frac {an+b}c\rfloor-\frac12f(c,c-b-1,a,\lfloor\frac{an+b}{c}\rfloor-1)-\frac12\\g(c,c-b-1,a,\lfloor\frac{an+b}{c}\rfloor-1) \end{aligned} \]
如此递归,我们就可以在\(O(logn)\)的渐进时间复杂度内把\(f,g,h\)都求出来了。

猜你喜欢

转载自www.cnblogs.com/LLCSBlog/p/12301258.html