类欧

最基础的形式。

\[\sum\limits_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor=f(n,a,b,c) \]

考虑化简。

\[\begin{aligned} &\sum\limits_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor\\ =&\sum\limits_{i=0}^n\sum\limits_{j=0}^{\lfloor\rfloor-1}1\\ =&\sum\limits_{j=0}^{\lfloor\frac{an+b}{c}\rfloor-1}\sum\limits_{i=0}^n[j<\frac{ai+b}{c}] \end{aligned} \]

研究不等式的含义:

\[\begin{aligned} &j<\frac{ai+b}{c}\\ &j+1\le \frac{ai+b}{c}\\ &jc+c-b-1<ai\\ &i>\frac{jc+c-b-1}{a} \end{aligned} \]

于是可以变成:

\[\begin{aligned} &\sum\limits_{j=0}^{\lfloor\frac{an+b}{c}\rfloor-1}\sum\limits_{i=0}^n[j<\frac{ai+b}{c}]\\ =&\sum\limits_{j=0}^{\lfloor\frac{an+b}{c}\rfloor-1}n-\frac{jc+c-b-1}{a}\\ =&n\frac{an+b}{c}-\sum\limits_{j=0}^{\frac{an+b}{c}-1}\frac{jc+c-b-1}{a} \end{aligned} \]

然后发现前面可以直接算,后面可以直接化成 \(f(\frac{an+b}{c}-1,c,c-b-1,a)\)

最后有一个事情是说如果 \(\max(a,b)\ge c\) 时需要处理一下。似乎是这样的,稍微推一下。

\[\sum\limits_{i=0}^n\frac{ai+b}{c}\\ =\sum\limits\frac{a'i+b'+a''ci+b''c}{c}\\ =\sum\limits_{i=0}^n\frac{a'i+b'}{c}+a''i+b''\\ =\frac{(n+1)n}{2}a''+(n+1)b''+f(n,a',b',c) \]

然后就没了。复杂度是 \(O(\log \max(a,c))\)。大概是因为这个取模的过程比较像欧几里得求 \(\gcd\) 的过程,所以这个算法叫类欧几里得算法。

代码:

inline int lo(int n,int a,int b,int c){
	if(a==0)return (n+1)*(b/c)%mod;
	if(max(a,b)>=c){
		int an=n*(n+1)/2%mod*(a/c)+(n+1)*(b/c);
		return (an+lo(n,a%c,b%c,c))%mod;
	}
	int rt=(a*n+b)/c;
	return (rt*n-lo(rt-1,c,c-b-1,a))%mod;
}
posted @ 2023-03-08 17:07  Feynn  阅读(19)  评论(0编辑  收藏  举报