类欧几里得算法简单形式
类欧几里得算法简单形式
类欧几里得算法,基础版,在 \(O(\log n)\) 的时间复杂度下计算:
\[\begin{align*}
f(a,b,c,n)&=\sum_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor\\
\end{align*}
\]
我们考虑先化简:
- \(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*} \]
- \(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\) 为斐波那契数列的相邻项时跑满。