類歐幾里得入土總結 2

2022-02-23 18:45:41 字數 3760 閱讀 5454

直接說 loj萬能歐幾里得這道題

題目要我們求這個式子

\[\sum^n_ a^xb^

\]考慮一件這樣的事情,平面上一條直線\(ax+b\over c\),關於這條直線,我們放到網格圖上,從左到右,我們遇到一條橫線執行一次\(u\)操作,遇到一次豎線執行一次\(r\)操作,經過乙個整點,執行ur操作。u代表迭代一次\(\rm curb*=b\),r代表迭代一次\(\rm cura*=a\)然後累加一遍\((\rm cura)\times ()\),這相當於在模擬這個\(\sum\)的操作,我們稱\(ur\)構成的序列叫做操作序列。

若此處的\(<+,\times>\)有兩者有結合律,\(+\)要對$\times $有分配律,x,y是操作序列,xy表示直接首尾相接起來。我們容易證明以下等式

\[\cases

\]也就是說那麼操作序列具有結合律

記五元組\((n,a,b,c,x,y)=s\)表示我要生成乙個操作序列\(s\),規則是對於直線\(f(x)=y=\lfloor \rfloor,x\in [1,n]\) ,放在網格上,從左下往右上走,每經過乙個豎線新增一段運算元列\(y\),每經過乙個橫線新增一段操作序列\(x\)(同時經過先進行\(x\)操作)。

注意到這個\(s\)總共有\(n\)個\(y\),第\(i\)個\(y\)之前有\(\)個\(x\)。

沿用【瞎講】類歐幾里得入土教程的思路,我們考慮將\(a,b\)都化到小於\(c\)的情況。

重要補充

設\(g(i)\)表示在第\(i\)個\(y\)之前有多少個\(x\),我們有

\[g(i)=\beginf(1)&i=1\\f(i)-f(i-1) &\rm otherwise\end

\]定義\(f\)的和定義和\(g\)等價,描述的是同乙個情況,為了方便理解建議用差分的角度理解(i到i-1個y之間有多少個x)

先考慮\(b\ge c\)的情況,我們要使得$b\to b%c $

第\(i>1\)個\(y\)之前有\(f(i)-f(i-1)\)個\(x\),而\(b\to b\% c\)對這個差分毫無影響。

然而\(i=1\)的時候有小問題,第乙個\(y\)之前個\(x\)我們不是差分定義的,而我們使得\(b\to b\%c\),使得在第乙個\(y\)之前少了一些\(y\),具體的,少了\(\lfloor\rfloor -\lfloor \rfloor=\lfloor\rfloor\)個\(y\)。

根據以上的分析,我們得到了

\[(n,a,b,c,x,y)=\underbrace_\rfloor}(n,a,b\%c,c,x,y)\quad b\ge c

\]再考慮\(a\ge c\)的情況,我們要使得\(a\to a\% c\)

此時\(f(x)=\lfloor\rfloor+\lfloor\rfloor x\),設\(f'(x)=\lfloor\rfloor\),\(g'\)是\(f'\)的差分,我們發現\(g(i)=\lfloor \rfloor+g'(i)\),即任何乙個\(y\)之前都緊貼著\(\lfloor\rfloor\)個\(x\)

因此

\[(n,a,b,c,x,y)=(n,a\%c,b,c,x,\underbrace_\rfloor}\space y) \quad a\ge c

\]繼續沿用上面那個部落格的思路,到了真正解決問題的時刻了

考慮現在我們只需要解決的問題是\(a,b

邊界情況:

關於\(a=0\)的情況退化為一條平行於\(x\)的直線,就是填\(n\)個\(y\)

而\(b=0\)無所謂

\(a,b意味著一件事情,這個直線非常平緩,甚至填了若干個\(y\)才填乙個\(x\)。

這也意味著另一件事情,那就是乙個\(x\)之前有若干個\(y\)。

考慮 第\(j>1\)個\(x\)之前有多少個\(y\),即考慮\(\max\limits_ \lfloor \rfloor< j\)。這即\(m=f'(j),j>1\)

解出來\[m=\lfloor\rfloor\quad j>1

\]也就是從第二個\(x\)開始到第\(\lfloor\rfloor\)個\(x\)是乙個子問題(要記得令\(j=j-1\)並把\(c\)放出來,即)

\[f''(j)=\lfloor\rfloor \quad j\ge 1

\]而第乙個\(x\)之前還有\(f''(0)\)個\(y\),這一部分補上。

還有乙個問題是,最後乙個\(x\)之後可能還有\(y\)沒有統計到,我們手動算出來補在後面即可。

根據以上的分析,我們得到了

\[(n,a,b,c,x,y)=\underbrace_\rfloor}\ x \ (\lfloor\rfloor-1,c,c-b-1,a,y,x)\underbrace_\rfloor-1)+(c-b-1)\over a}\rfloor} \quad a,b

先把公式全寫出來

\[(n,a,b,c,x,y)=

\begin

\underbrace_\rfloor}(n,a,b\%c,c,x,y)& b\ge c

\\(n,a\%c,b,c,x,\underbrace_\rfloor}\space y) & a\ge c

\\\underbrace_\rfloor}\ x \ (\lfloor\rfloor-1,c,c-b-1,a,y,x)\underbrace_\rfloor-1)+(c-b-1)\over a}\rfloor} & \rm otherwise

\end

\]然而求很多操作序列的疊加要用分治,是乙個\(\log\)的,但是發現每次分治的長度是按除法遞減的,仔細分析一波發現就是\(\log n\)。(這裡地方太小我寫不下)

實現時注意每次呼叫遞迴時,要注意將第乙個\(y\)之間的\(x\)補上($\rm case::otherwise $ \ 的補\(y\)也可以理解為這個)。

這種寫法的一大好處是,遞迴部分完全不需要改動,需要改動的只有操作序列的合併方式。如果操作可以對應到矩陣那就完全不要改動了。

這種寫法的另一大好處是,任何良好定義的\(\),且curb,cura的"迭代"有結合律和交換律,都可以套用這個做法。(泰拳警告:求多項式,超現實數,floyd陣列,sg函式,圖連通性的sum)

如果\(\sum\)後面是\(k\)個項相乘(但是有交換律)也能解決(我願稱之為k階-類歐幾里得)

**實現上,由於\(case1\)和\(case3\)的統一性,可以每次在遞迴呼叫前直接補上$\lfloor \rfloor $ ( \(case2\)除外),那麼每次進入乙個遞迴馬上可以\(b\to b\%c\)。

此外,注意到當\(f(1)=0\)的時候特殊處理下。

目前loj rk4 不知道為啥我跑得這麼快qwq

//@winlere

#include#include#include#include#define mod 998244353

typedef long long ll;

ll qr()

int mod(const int&x)

int mod(const int&x,const int&y)

int n;

struct eu

int*operator(int x)

mat operator + (const mat&x)const

};ll f(ll x,ll a,ll b,ll c)

eu solve(ll n,ll a,ll b,ll c,const eu&x,const eu&y)

int main()

瞎講 類歐幾里得入土教程

假設我們現在得到一條直線 y ax b 現在要數出 x in 0,n 時,在 x 正半軸和這條直線之間的整點個數,n le 10 這個方程一定可以化為這樣的形式 y dfrac 列舉 x in 0,n 直接算其整點個數,答案就是 sum n lfloor dfrac rfloor 考慮如何快速計算這...

類歐幾里得小記

每次看了很快就忘了,乾脆寫一篇部落格,來加深記憶。設 f a,b,c,n sum lfloor dfrac rfloor g a,b,c,n sum i lfloor dfrac rfloor g a,b,c,n sum rfloor 2 m lfloor dfrac rfloor 當a c時,f ...

類歐幾里得演算法

比較快速地算出下面的式子 f n,a,b,c,k 1,k 2 sum limits n x lfloor frac rfloor 不妨假設現在 a geq c 或 b geq c 那麼 sum limits n x lfloor frac rfloor sum limits n x lfloor f...