1. 程式人生 > >類歐幾里得演算法(部分)

類歐幾里得演算法(部分)

Preface

歐幾里得演算法,就是輾轉相除法。
gcd(i,j)=gcd(j,i%j)

定義

定義函式
F(a,b,c,n)=i=0nai+bc

推導一波

顯然當ac或者bc時,F(a,b,c,n)=i=0n((amodc)i+(bmodc)c+aci+bc
=F(a%c,b%c,c,n)+ac(n+1)n/2+bc(n+1)

若當a,b均大於c怎麼辦?
據大佬說轉換成幾何意義就是一條直線與x軸、y軸以及x=n圍成的直角梯形中的整點個數

列舉縱線,
原式可化為
m=an+bc就是上面式子i=n時的數

列舉每個數
F(a,b,c,n

)=i=0nj=1m[ai+bcj]

儘量化成j=0
=i=0nj=0m1[ai+bcj+1]

大於等於下整除和不整除是一樣的
=i=0nj=0m1[(ai+bc)j+1]

變換一下
=i=0nj=0m1[(aicj+cb]

=i=0nj=0m1[(i(cj+cb)a]
注意這裡沒有取整

大於等於,因為左邊是整數
分子減1,符號變成大於
=i=0nj=0m1[(i>(cj+cb1)a]

交換主體
=j=0m1i=0n[(i>(cj+cb1)a]

然後裡面的sigma可以撤掉
=j=0m1n(cj+cb1

)a
=nmj=0