萬惡之源spa
首先推一下能夠發現,咱們能夠分「位」計算。.net
設二進制下第\(k\)對答案的貢獻爲\(\mathrm{Ans_k}\),則
\[\mathrm{Ans_k=}\sum\limits_{i=1}^{n} \texttt{「ai+b的第k位爲1」}=\sum\limits_{i=1}^{n} \left \lfloor \frac{ai+b}{2^{k}} \right \rfloor \bmod 2 =\sum\limits_{i=1}^{n} \left \lfloor \frac{ai+b}{2^{k}} \right \rfloor - 2\left \lfloor \frac{ai+b}{2^{k+1}} \right \rfloor\]get
最後一步至關於第\(k\)以前的內容消掉。it
而後就引出了一個通用的問題:如何快速地求出\(\sum\limits_{i=0}^{n}\left \lfloor \dfrac{ai+b}{c} \right \rfloor\)的值。ast
首先咱們能夠先算一下\(\sum\limits_{i=0}^{n}\left \lfloor \dfrac{ai+b}{c} \right \rfloor\)的值(由於類歐的下標就是從\(0\))開始的。class
(設\(f(a,b,c,n)=\sum\limits_{i=0}^{n} \left \lfloor \dfrac{ai+b}{c} \right \rfloor\))變量
\(\left \lfloor \dfrac{ai+b}{c} \right \rfloor\)多是個假分數,因此咱們能夠把它拆成一個帶分數。二進制
設\(a'=a \mod c\),\(b'=b \mod c\)。im
則di
\[\sum\limits_{i=0}^{n}\left \lfloor \dfrac{ai+b}{c} \right \rfloor=\left \lfloor \frac{a'i+b'}{c} \right \rfloor +i \left \lfloor \frac{a}{c} \right \rfloor+\left \lfloor \frac{b}{c} \right \rfloor = f(a',b',c,n)+\dfrac{(n+1)n}{2}\left \lfloor \frac{a}{c} \right \rfloor+(n+1)\left \lfloor \frac{b}{c} \right \rfloor\]
對於\(a<c,b<c\)的狀況,咱們就再次亂搞。
(設\(m=\left \lfloor \dfrac{an+b}{c} \right \rfloor\))
那麼$f(a,b,c,n) =\sum\limits_{i=0}^{n}\sum\limits_{j=1}^{m} [\left \lfloor \dfrac{ai+b}{c} \right \rfloor \geqslant j ] $
這一步貌似把原式變複雜了,可是接下來就會發覺這是有用的。
接着,咱們把\(j\)的下標改一改:$\sum\limits_{i=0}^{n}\sum\limits_{j=0}^{m-1} [\left \lfloor \dfrac{ai+b}{c} \right \rfloor \geqslant j+1 ] $
很好,接下來就開始秀操做了。
將求和符號右邊的式子轉換一下,得$\sum\limits_{i=0}^{n}\sum\limits_{j=0}^{m-1} [i \geqslant \dfrac{jc+c-b}{a} ] $
把第一個求和符號去掉(由於方框裏面那個只是\(bool\)變量,徹底能夠換成差式),再把不等式的符號改爲大於號,得
$\sum\limits_{j=0}^{m-1} n- \left \lfloor \dfrac{jc+c-b-1}{a} \right \rfloor $
這裏多了個\(-1\)是由於$x \geqslant y \Rightarrow x>y-1 $,而後向下取整消失了又出現是正確的,這裏真的不想解釋。
而後有沒有發現$\left \lfloor \dfrac{jc+c-b-1}{a} \right \rfloor \(和\)f$的定義很像?
沒錯!這就說明咱們的變換成功了!
將上面式子中的\(n\)提出求和符號,再將\(f\)代入,得
\(nm-f(c,c-b-1,a,m-1)\)
因此這就是類歐。
固然了,類歐的基本式子還能夠加上指數和係數,這個有空再更。