类欧
最基础的形式。
\[\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;
}