类欧几里得算法简单形式

类欧几里得算法简单形式

类欧几里得算法,基础版,在 \(O(\log n)\) 的时间复杂度下计算:

\[\begin{align*} f(a,b,c,n)&=\sum_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor\\ \end{align*} \]

我们考虑先化简:

  1. \(a\ge c\),设 \(a=qc+r(0\le r<c)\),有:

\[\begin{align*} f(a,b,c,n)&=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\sum_{i=0}^n\left\lfloor\frac{(qc+r)i+b}{c}\right\rfloor\\&=\frac{qn(n+1)}{2}+\sum_{i=0}^n\left\lfloor\frac{ri+b}{c}\right\rfloor \end{align*} \]

  1. \(b\ge c\),设 \(b=qc+r(0\le r<c)\),有:

\[\begin{align*} f(a,b,c,n)&=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\sum_{i=0}^n\left\lfloor\frac{ai+qc+r}{c}\right\rfloor\\&=(n+1)q+\sum_{i=0}^n\left\lfloor\frac{ai+r}{c}\right\rfloor \end{align*} \]

经过上述步骤,可以化为 \(a<c,b<c\) 的情况:

\[\begin{align*} f(a,b,c,n)&=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\sum_{i=0}^n\sum_{j=0}^{\left\lfloor\frac{ai+b}{c}\right\rfloor-1}1\\&=\sum_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\sum_{i=0}^n\left[j<\left\lfloor\frac{ai+b}{c}\right\rfloor\right]\\ \end{align*} \]

而对于限制条件,有:

\[\begin{align*} j<\left\lfloor\frac{ai+b}{c}\right\rfloor&\implies j+1\le \frac{ai+b}{c}\\ &\implies cj+c\le ai+b\\&\implies \frac{cj+c-b}{a}\le i \\&\implies \left\lfloor\frac{cj+c-b-1}{a}\right\rfloor<i \end{align*} \]

所以,我们设 \(m=\left\lfloor\frac{an+b}{c}\right\rfloor\),则:

\[\begin{align*} \text{原式}&=\sum_{j=0}^{m-1}\sum_{i=0}^n\left[\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor<i\right]\\&=\sum_{j=0}^{m-1}\left(n-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right)\\&=mn-\sum_{i=0}^{m-1}\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\\&=mn-f(c,c-b-1,a,m-1) \end{align*} \]

由此,原问题可以递归解决。

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

时间复杂度?我们只需注意函数的第一项和第三项,它们的关系如同求 \(\gcd(a,b)=\gcd(b,a\bmod b)\) 一样,是 \(O(\log n)\) 的,同时在 \(a,b\) 为斐波那契数列的相邻项时跑满。

posted @ 2023-08-07 16:10  spdarkle  阅读(4)  评论(0编辑  收藏  举报