萬能歐幾里得


這個目前網上好像沒有詳細的教程,我來造福社會吧。

為了方便本文的敘述,做一個不嚴謹的規定。在本文中一個\(01\)串可以對應一些信息,並且這些信息是支持合並的,即如果用\(g(S)\)表示\(01\)\(S\)對應的信息,那么可以用\(g(S)\)\(g(T)\)計算出\(g(S+T)\)。因此我們不妨類比字符串,將這類信息的合並看作是加法。同樣的,這類信息與數字的乘法代表連續的合並。

萬能歐幾里得可以解決基本所有的類歐幾里得問題,而且不同的問題不需要重新推式子,只需要稍作修改即可。

首先來形式化的說明一下萬能歐幾里得能解決的問題:

給定\(p,q,r,l\)以及\(g('0')\)\(g('1')\),並給出一種信息合並的方式滿足\(g(S)+g(T)=g(S+T)\)。從左至右考慮函數\(y=\frac{px+r}{q}\)\((0,l]\)內的直線並維護一個\(01\)字符串\(S\),每當和\(x=c\)\(c\)是整數)相交時在\(S\)的末尾添加\('0'\),每當和\(y=c\)\(c\)是整數)相交時在\(S\)的末尾添加\('1'\),當經過整點時先添加\('1'\)后添加\('0'\)。求\(01\)\(S\)所對應的信息。

可以發現類歐幾里得問題都可以轉化為上述問題。舉個例子,如果我們要求:

\[\sum_{i=0}^li\lfloor\frac{pi+r}{q}\rfloor \]

那么從結果上來講我們只需要知道每個串對應的\(\sum i\lfloor\frac{pi+r}{q}\rfloor\),考慮對兩個串進行合並,那么對於后面的串來講\(\sum i\lfloor\frac{pi+r}{q}\rfloor\)就變成了\(\sum (i+x)(\lfloor\frac{pi+r}{q}\rfloor+y)\),其中\(x\)\(y\)分別是前面的串中\(i\)\(\lfloor\frac{pi+r}{q}\rfloor\)最終的值。那么顯然為了合並\(x\)\(y\)也是需要維護的。

進一步考慮\(\sum (i+x)(\lfloor\frac{pi+r}{q}\rfloor+y)=(\sum i\lfloor\frac{pi+r}{q}\rfloor)+(x\sum\lfloor\frac{pi+r}{q}\rfloor)+(y\sum i)+(xy\sum 1)\),考慮到\(\sum i\)\(\sum 1\)都可以由后面的串的\(x\)直接得到因此無需維護,只需要再對\(\sum\lfloor\frac{pi+r}{q}\rfloor\)進行維護即可。維護的計算方式稍加推導即可得知。

我們將解決上述問題的方法表示為\(f(p,q,r,l,s_0,s_1)\)(其中\(s_0\)\(s_1\)分別表示\(g('0')\)\(g('1')\)),考慮如何遞歸至更小的規模:

首先可以發現,我們將\(r\)\(q\)取余是沒有關系的(因為\(S\)不會改變),於是可以保證\(r<q\)

接着,如果\(p<q\)考慮如何轉化為\(p\geq q\)。發現這或許可以通過將坐標系的橫縱軸翻轉解決。我們設\(k=\lfloor\frac{pl+r}{q}\rfloor\),那么可以考慮先處理好值域在\((1,k]\)之間的部分。如果\(k=0\),那么不會經過\(y=c\),我們直接返回\(s_0*l\)。否則我們將坐標軸反轉並平移,可以使之前的問題等價於函數\(y=\frac{qx+(q-r)}{p}\)\((0,k-1]\)之間的部分,此時我們需要將\(s_0\)\(s_1\)互換。不過這里有一個問題是互換了\(s_0\)\(s_1\)以后,如果經過了整點那么實際的順序會與我們規定的相反,為了解決這個問題,我們將函數整體向下平移\(\frac{1}{p}\),即變成\(y=\frac{qx+(q-r-1)}{p}\),那么原來的經過整點就變成了先與\(x=c\)相交的情況,和我們期望的一致,並且對其它的經過方式都不會產生結果上的變化。當然這會對頭尾的需要單獨處理的一小部分產生一些影響,接下來會說明這個問題。現在我們可以遞歸到\(f(q,p,q-r-1,s_1,s_0)\)

接下來還需要處理首尾的問題。先考慮開頭,由於我們已經處理了值域在\(1\)之后的,那么與\(y=c\)相交的情況只會出現一次,於是我們統計與\(x=c\)相交的次數,那么就是函數與\(y=1\)相交的點的橫坐標的下取整即\(\lfloor\frac{q-r}{p}\rfloor\)。不過需要特別注意的是當\(\frac{q-r}{p}\)為整數時,我們經過了\((1,\frac{q-r}{p})\)這個整點,而由於我們之前將遞歸的函數下移了\(\frac{1}{p}\),因此遞歸的部分實際上會將與\(x=\frac{q-r}{p}\)相交的情況包含,因此我們在開頭需要計算的與\(x=c\)相交的次數只有\(\lfloor\frac{q-r-1}{p}\rfloor\)次,之后再與\(y=1\)相交。即,在開頭需要額外添加的信息是\(s_0*{\lfloor\frac{q-r-1}{p}\rfloor}+s_1\)

尾部的問題也是類似的。由於函數值的整數部分不會再增加,於是只有與\(x=c\)相交的情況。計算可得與\(y=k\)相交的點橫坐標為\(\frac{kq-r}{p}\),由於遞歸下去的函數平移了\(\frac{1}{p}\)因此我們實際上只處理到了\(\frac{kq-r-1}{p}\),於是我們在末尾加上\(s_0*({l-\lfloor\frac{kq-r-1}{p}\rfloor})\)即可。

於是我們可以保證\(p\geq q\),考慮怎么解決這一部分。

我們設\(k=\lfloor\frac{p}{q}\rfloor\),那么原函數可以表示為\(y=kx+\frac{(p\ \bmod\ q)x+r}{q}\),將其與函數\(y=\frac{(p\ \bmod\ q)x+r}{q}\)相比,相當於在每次經過\(x=c\)之前額外經過\(k\)\(y=c\)。於是我們可以遞歸至\(f(p\bmod q,q,r,l,s_1*k+s_0,s_1)\)

綜上所述,我們完整的解決了萬能歐幾里得問題。為了使思路更加清晰,我們用偽代碼的形式重新整理一遍之前的方法。

\(f(p,q,r,l,s_0,s_1)\)
\(\ \ \ \ r=r\bmod q\)
\(\ \ \ \ \text{if}\ p<q\ \text{then}\)
\(\ \ \ \ \ \ \ \ k=\lfloor\frac{pl+r}{q}\rfloor\)
\(\ \ \ \ \ \ \ \ \text{if}\ k=0\ \text{then}\)
\(\ \ \ \ \ \ \ \ \ \ \ \ \text{return}\ s_0*l\)
\(\ \ \ \ \ \ \ \ \text{return}\ s_0*{\lfloor\frac{q-r-1}{p}\rfloor}+s_1+f(q,p,q-r-1,k-1,s_1,s_0)+s_0*(l-\lfloor\frac{kq-r-1}{p}\rfloor)\)
\(\ \ \ \ \text{else}\)
\(\ \ \ \ \ \ \ \ k=\lfloor\frac{p}{q}\rfloor\)
\(\ \ \ \ \ \ \ \ \text{return}\ f(p\bmod q,q,r,l,s_1*k+s_0,s_1)\)

如果將維護信息的加法和乘法的復雜度看作\(O(1)\),那么萬能歐幾里得的復雜度與歐幾里得算法的分析相似,為\(O(\log n)\)。值得注意的是通常為了方便乘法可以用倍增進行快速乘,不過如果分析系數與乘數的關系可以得到更快的方法。

\(P.S.\)用平移\(\frac{1}{p}\)的方式處理特殊要求的方法是嘿嘿嘿同學告訴我的,嘿嘿嘿太強了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM