【算法笔记】类欧几里得相关

·前置芝士

·欧几里得算法

又称辗转相除法,举例如gcd求法,基本递归函数为(f(a,b)=f(b,amod b))

证明:a可以表示成(a = kb + r)(a,b,k,r皆为正整数,且(r<b)),则(r = a mod b)。假设d是a,b的一个公约数,记作(d|a),(d|b),即a和b都可以被d整除。而r = (a - kb),两边同时除以d,(r/d=a/d-kb/d=m),由等式右边可知m为整数,因此(d|r)因此d也是(b,a mod b)的公约数。因((a,b))((b,amod b))的公约数相等,则其最大公约数也相等。

·正文

·定义:定义函数(f(a,b,c,n)=sum_{i=0}^{n} lfloor frac{ai+b}{c} floor),其中a,b,c,d都是常数,我们要求算法复杂度为(O(n log n))

·求解方式:我们可以对该式子做一些处理:

​ ·对于(ageq c)(b geq c),我们可以直接将(a)(b)(c)取模以简化问题。将式子改变一下可得:

(f(a,b,c,n))

(=sum_{i=0}^{n} lfloor frac{ai+b}{c} floor)

(=sum_{i=0}^{n} frac{(lfloor frac{a}{c} floor c+amod c)i+(lfloor frac{b}{c} floor c+bmod c)}{c})

(=frac{n(n+1)}{2}lfloorfrac{a}{c} floor+(n+1)lfloorfrac{b}{c} floor+ sum_{i=0}^{n}lfloor frac{(amod c)i+(bmod c)}{c})

(=frac{n(n+1)}{2}lfloorfrac{a}{c} floor+(n+1)lfloorfrac{b}{c} floor+ f(amod c,bmod c,c,n))

那么问题转化为了(a<c)(b<c)的情况。接下来我们从该i下手,我们尝试合并贡献来计算。但是这个式子的贡献似乎不好合并。那么我们转化一下,将和的式子变成另一个格式:(sum_{i=0}^{n} sum_{j=0}^{lfloor frac{ai+b}{c} floor-1}1)

然后我们来试试看搞一个和(j)有关的贡献式。我们可以用上面和式中的(n)限制(i)的上界,然后用(i)来限制(j)的上界。然后我们交换一下(i)(j)的求和算子。得到:(sum_{j=0}^{lfloor frac{an+b}{c} floor-1}sum_{i=0}^{n}[j<lfloorfrac{ai+b}{c} floor])

然后我们来把下取整符号拿下,可得:(j+1leqfrac{ai+b}{c})

然后变换一下又有:(jc+c-b-1<ai)

然后我们向下取整:(lfloorfrac{jc+c-b-1}{a} floor<i)

我们定义(m=lfloorfrac{an+b}{c} floor),则有

(f(a,b,c,n))

(=sum_{j=0}^{m-1}sum_{i=0}^{n}[i>lfloorfrac{jc+c-b-1}{a} floor])

(=sum_{j=0}^{m-1}n-lfloorfrac{jc+c-b-1}{a} floor)

(=nm-f(c,c-b-1,a,m-1))

·代码:

long long f(long long a,long long b,long long c,long long n){
	if(a==0)return((b/c)*(n+1));
	if(a>=c||b>=c)return f(a%c,b%c,c,n)+(a/c)*n*(n+1)/2+(b/c)*(n+1);
	long long m=(a*n+b)/c;
	return n*m-f(c,c-b-1,a,m-1);
}

·扩展:

给出另外两个定义:

定义(g(a,b,c,n)=sum_{i=0}^{n}ilfloorfrac{ai+b}{c} floor)(h(a,b,c,n)=sum_{i=0}^{n}lfloorfrac{ai+b}{c} floor^2)

·关于g的解法:

首先取模,有:(g(a,b,c,n)=g(amod c,bmod c,c,n)+lfloorfrac{a}{c} floor frac{n(n+1)(2n+1)}{6}+lfloorfrac{b}{c} floorfrac{n(n+1)}{2})

然后考虑(a<c)(b<c),依旧令(m=lfloorfrac{an+b}{c} floor),有:

(g(a,b,c,n)=frac{1}{2}[mn(n+1)-h(c,c-b-1,a,m-1)-f(c,c-b-1,a,m-1)])

·关于h的解法:

首先取模,有(h(a,b,c,n)=h(amod c,bmod c,c,n)+2lfloorfrac{b}{c} floor f(amod c,bmod c,c,n)+)

(2lfloorfrac{a}{c} floor g(amod c,bmod c,c,n)+lfloorfrac{a}{c}^2frac{n(n+1)(2n+1)}{6}+lfloorfrac{b}{c} floor^2(n+1)+lfloorfrac{a}{c} floor lfloorfrac{b}{c} floor n(n+1))

然后考虑(a<c)(b<c),令(m=lfloorfrac{an+b}{c} floor),有:

(h(a,b,c,n)=nm(m+1)-2g(c,c-b-1,a,m-1)-2f(c,c-b-1,a,m-1)-f(a,b,c,n))

对于以上几种定义可以同步进行计算。

(PS:关于这一部分的具体推导过程请看参考资料部分)

·参考资料:

https://oi-wiki.org/math/euclidean/

原文地址:https://www.cnblogs.com/linskyQWQ/p/14597989.html