类欧几里得算法

来源

类欧几里德算法由洪华敦大佬在 2016 年 NOI \text{NOI} NOI 冬令营营员交流中提出。截止 2020 年 4 月 29 日,百度百科和维基百科都尚未收录该词条 Orz \text{Orz} Orz

前置知识

取整函数

⌊ a b ⌋ \left\lfloor\frac{a}{b}\right\rfloor ba a b \frac{a}{b} ba 向下取整, ⌈ a b ⌉ \left\lceil\frac{a}{b}\right\rceil ba a b \frac{a}{b} ba 向上取整。
基与下面的类欧几里得算法的推导过程,需要掌握一些取整函数的技巧。
⌊ a b ⌋ ⩾ c ⇔ a ⩾ b c     ⌈ a b ⌉ ⩽ c ⇔ a ⩽ b c     ⌊ a b ⌋ < c ⇔ a < b c     ⌈ a b ⌉ > c ⇔ a > b c \left\lfloor\frac{a}{b}\right\rfloor\geqslant c \Leftrightarrow a\geqslant bc\ \ \ \left\lceil\frac{a}{b}\right\rceil\leqslant c \Leftrightarrow a\leqslant bc\ \ \ \left\lfloor\frac{a}{b}\right\rfloor< c \Leftrightarrow a< bc\ \ \ \left\lceil\frac{a}{b}\right\rceil> c \Leftrightarrow a> bc bacabc   bacabc   ba<ca<bc   ba>ca>bc
⌊ a b ⌋ = ⌈ a + b + 1 b ⌉     ⌈ a b ⌉ = ⌊ a + b − 1 b ⌋ \left\lfloor\frac{a}{b}\right\rfloor=\left\lceil\frac{a+b+1}{b}\right\rceil\ \ \ \left\lceil\frac{a}{b}\right\rceil=\left\lfloor\frac{a+b-1}{b}\right\rfloor ba=ba+b+1   ba=ba+b1

证明要略

a   m o d   b = 0 a\bmod b=0 amodb=0 时,上述式子显然都成立;当 a   m o d   b ≠ 0 a\bmod b\ne 0 amodb=0 时,可以令 a = k b + m a=kb+m a=kb+m ,其中 k , m ∈ N ∗ k,m\in N^* k,mN 1 ⩽ m < b 1\leqslant m<b 1m<b,可以轻易得到证明。

引入

类欧几里得算法主要用来计算形如 ∑ i = 0 n ⌊ a i + b c ⌋ \sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor i=0ncai+b ∑ i = 0 n i ⌊ a i + b c ⌋ \sum\limits_{i=0}^n i\left\lfloor\frac{ai+b}{c}\right\rfloor i=0nicai+b ∑ i = 0 n ⌊ a i + b c ⌋ 2 \sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2 i=0ncai+b2的表达式。
f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ f(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor f(a,b,c,n)=i=0ncai+b g ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋ g(a,b,c,n)=\sum\limits_{i=0}^n i\left\lfloor\frac{ai+b}{c}\right\rfloor g(a,b,c,n)=i=0nicai+b h ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2 h(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2 h(a,b,c,n)=i=0ncai+b2
其结果由递归函数得到。
由于推导过程类似欧几里得算法,时间复杂度同欧几里得算法一样也是 log ⁡ n \log n logn ,故称类欧几里得算法。

推导

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

f ( a , b , c , n ) f(a,b,c,n) f(a,b,c,n) 的形式最为简单,也最常出现;其几何意义为直角坐标系下,直线 y = a x + b c y=\frac{ax+b}{c} y=cax+b x , y x,y x,y 两轴包围区域内的整点个数。
a ⩾ c a\geqslant c ac b ⩾ c b\geqslant c bc时,意味着可以将 a , b a,b a,b c c c 取模简化问题。
a ⩾ c a\geqslant c ac b ⩾ c b\geqslant c bc
f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ = ∑ i = 0 n ⌊ ( ⌊ a c ⌋ c + a   m o d   c ) i + ( ⌊ b c ⌋ c + b   m o d   c ) c ⌋ = ∑ i = 0 n [ ⌊ a c ⌋ i + ⌊ b c ⌋ + ⌊ ( a   m o d   c ) i + ( b   m o d   c ) c ⌋ ] = ∑ i = 0 n ( ⌊ a c ⌋ i + ⌊ b c ⌋ ) + ∑ i = 0 n ⌊ ( a   m o d   c ) i + ( b   m o d   c ) c ⌋ = n ( n + 1 ) 2 ⌊ a c ⌋ + ( n + 1 ) ⌊ b c ⌋ + f ( a   m o d   c , b   m o d   c , c , n ) \begin{aligned}&f(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\sum\limits_{i=0}^n\left\lfloor\frac{\left(\left\lfloor\frac{a}{c}\right\rfloor c+a\bmod c\right)i+\left(\left\lfloor\frac{b}{c}\right\rfloor c+b\bmod c\right)}{c}\right\rfloor \\&=\sum\limits_{i=0}^n\left[\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor+\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor\right]\\&=\sum\limits_{i=0}^n\left(\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor\right)+\sum\limits_{i=0}^n\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor\\&=\frac{n(n+1)}{2}\left\lfloor\frac{a}{c}\right\rfloor+(n+1)\left\lfloor\frac{b}{c}\right\rfloor+f(a\bmod c,b\bmod c,c,n)\end{aligned} f(a,b,c,n)=i=0ncai+b=i=0nc(cac+amodc)i+(cbc+bmodc)=i=0n[cai+cb+c(amodc)i+(bmodc)]=i=0n(cai+cb)+i=0nc(amodc)i+(bmodc)=2n(n+1)ca+(n+1)cb+f(amodc,bmodc,c,n)
那么问题就转化为 a < c a<c a<c b < c b<c b<c 的情况。我们观察式子,发现只有 i i i 这一个变量,因此就只能从 i i i 下手。在推求和式时有一个常见的技巧,就是条件与贡献的放缩与转化。具体地说,在原式 f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ f(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor f(a,b,c,n)=i=0ncai+b 中, 0 ⩽ i ⩽ n 0\leqslant i\leqslant n 0in 是条件,而 ⌊ a i + b c ⌋ \left\lfloor\frac{ai+b}{c}\right\rfloor cai+b 是对总和的贡献。要加快一个求和式的计算,所有的方法都可以都可以归约为 贡献合并计算。如果发现式子的贡献难以合并,就可以将贡献与条件作转化得到另一个形式的求和式。
请阁下看好接下来的神仙操作! Orz \text{Orz} Orz
f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ = ∑ i = 0 n ∑ j = 1 ⌊ a i + b c ⌋ 1 f(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor=\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor}1 f(a,b,c,n)=i=0ncai+b=i=0nj=1cai+b1
a < c a<c a<c b < c b<c b<c
f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ = ∑ i = 0 n ∑ j = 1 ⌊ a i + b c ⌋ 1 = ∑ i = 0 n ∑ j = 1 ⌊ a n + b c ⌋ [ ⌊ a i + b c ⌋ ⩾ j ] = ∑ j = 1 ⌊ a n + b c ⌋ ∑ i = 0 n [ ⌊ a i + b c ⌋ ⩾ j ] = ∑ j = 1 ⌊ a n + b c ⌋ ∑ i = 0 n [ a i + b ⩾ c j ] = ∑ j = 1 ⌊ a n + b c ⌋ ∑ i = 0 n [ i ⩾ ⌈ c j − b a ⌉ ] = ∑ j = 1 ⌊ a n + b c ⌋ ∑ i = ⌈ c j − b a ⌉ n 1 = ∑ j = 1 ⌊ a n + b c ⌋ ( n − ⌈ c j − b a ⌉ + 1 ) = ∑ j = 1 ⌊ a n + b c ⌋ ( n − ⌊ c j + a − b − 1 a ⌋ + 1 ) = n ⌊ a n + b c ⌋ − ∑ j = 1 ⌊ a n + b c ⌋ ( ⌊ c j + a − b − 1 a ⌋ − 1 ) = n ⌊ a n + b c ⌋ − ∑ j = 1 ⌊ a n + b c ⌋ ⌊ c j − b − 1 a ⌋ = n ⌊ a n + b c ⌋ − ∑ j = 0 ⌊ a n + b c ⌋ − 1 ⌊ c ( j + 1 ) − b − 1 a ⌋ = n ⌊ a n + b c ⌋ − ∑ j = 0 ⌊ a n + b c ⌋ − 1 ⌊ c j + c − b − 1 a ⌋ = n ⌊ a n + b c ⌋ − f ( c , c − b − 1 , a , ⌊ a n + b c ⌋ − 1 ) \begin{aligned} &f(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor}1\\&=\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\left[\left\lfloor\frac{ai+b}{c}\right\rfloor\geqslant j\right]\\&=\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\sum\limits_{i=0}^n\left[\left\lfloor\frac{ai+b}{c}\right\rfloor\geqslant j\right]\\&=\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\sum\limits_{i=0}^n\left[ai+b\geqslant cj\right]\\&=\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\sum\limits_{i=0}^n\left[i\geqslant \left\lceil \frac{cj-b}{a}\right\rceil\right]\\&=\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\sum\limits_{i=\left\lceil \frac{cj-b}{a}\right\rceil}^n1\\&=\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\left(n-\left\lceil \frac{cj-b}{a}\right\rceil+1\right)\\&=\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\left(n-\left\lfloor \frac{cj+a-b-1}{a}\right\rfloor+1\right)\\&=n\left\lfloor\frac{an+b}{c}\right\rfloor-\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\left(\left\lfloor \frac{cj+a-b-1}{a}\right\rfloor-1\right)\\&=n\left\lfloor\frac{an+b}{c}\right\rfloor-\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\left\lfloor \frac{cj-b-1}{a}\right\rfloor\\&=n\left\lfloor\frac{an+b}{c}\right\rfloor-\sum\limits_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\left\lfloor \frac{c(j+1)-b-1}{a}\right\rfloor\\&=n\left\lfloor\frac{an+b}{c}\right\rfloor-\sum\limits_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\left\lfloor \frac{cj+c-b-1}{a}\right\rfloor\\&=n\left\lfloor\frac{an+b}{c}\right\rfloor-f\left(c,c-b-1,a,\left\lfloor\frac{an+b}{c}\right\rfloor-1\right)\end{aligned} f(a,b,c,n)=i=0ncai+b=i=0nj=1cai+b1=i=0nj=1can+b[cai+bj]=j=1can+bi=0n[cai+bj]=j=1can+bi=0n[ai+bcj]=j=1can+bi=0n[iacjb]=j=1can+bi=acjbn1=j=1can+b(nacjb+1)=j=1can+b(nacj+ab1+1)=ncan+bj=1can+b(acj+ab11)=ncan+bj=1can+bacjb1=ncan+bj=0can+b1ac(j+1)b1=ncan+bj=0can+b1acj+cb1=ncan+bf(c,cb1,a,can+b1)
边界条件为,当 a = 0 a=0 a=0 时, f ( a , b , c , n ) = ( n + 1 ) ⌊ b c ⌋ f(a,b,c,n)=(n+1)\left\lfloor\frac{b}{c}\right\rfloor f(a,b,c,n)=(n+1)cb

推导 g ( a , b , c , n ) g(a,b,c,n) g(a,b,c,n)

a ⩾ c a\geqslant c ac b ⩾ c b\geqslant c bc
g ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋ = ∑ i = 0 n i [ ⌊ ( a   m o d   c ) i + ( b   m o d   c ) c ⌋ + ⌊ a c ⌋ i + ⌊ b c ⌋ ] = ∑ i = 0 n i ⌊ ( a   m o d   c ) i + ( b   m o d   c ) c ⌋ + ∑ i = 0 n ⌊ a c ⌋ i 2 + ∑ i = 0 n ⌊ b c ⌋ i = n ( n + 1 ) ( 2 n + 1 ) 6 ⌊ a c ⌋ + n ( n + 1 ) 2 ⌊ b c ⌋ + ∑ i = 0 n i ⌊ ( a   m o d   c ) i + ( b   m o d   c ) c ⌋ = n ( n + 1 ) ( 2 n + 1 ) 6 ⌊ a c ⌋ + n ( n + 1 ) 2 ⌊ b c ⌋ + g ( a   m o d   c , b   m o d   c , c , n ) \begin{aligned}&g(a,b,c,n)=\sum\limits_{i=0}^n i\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\sum\limits_{i=0}^ni\left[\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor+\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor\right]\\&=\sum\limits_{i=0}^n i\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor+\sum\limits_{i=0}^n\left\lfloor\frac{a}{c}\right\rfloor i^2+\sum\limits_{i=0}^n\left\lfloor\frac{b}{c}\right\rfloor i\\&=\frac{n(n+1)(2n+1)}{6}\left\lfloor\frac{a}{c}\right\rfloor+\frac{n(n+1)}{2}\left\lfloor\frac{b}{c}\right\rfloor+\sum\limits_{i=0}^n i\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor\\&=\frac{n(n+1)(2n+1)}{6}\left\lfloor\frac{a}{c}\right\rfloor+\frac{n(n+1)}{2}\left\lfloor\frac{b}{c}\right\rfloor+g(a\bmod c,b\bmod c,c,n)\end{aligned} g(a,b,c,n)=i=0nicai+b=i=0ni[c(amodc)i+(bmodc)+cai+cb]=i=0nic(amodc)i+(bmodc)+i=0ncai2+i=0ncbi=6n(n+1)(2n+1)ca+2n(n+1)cb+i=0nic(amodc)i+(bmodc)=6n(n+1)(2n+1)ca+2n(n+1)cb+g(amodc,bmodc,c,n)
a < c a<c a<c b < c b<c b<c
g ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋ = ∑ i = 0 n ∑ j = 1 ⌊ a i + b c ⌋ i = ∑ i = 0 n ∑ j = 1 ⌊ a n + b c ⌋ i [ ⌊ a i + b c ⌋ ⩾ j ] = ∑ i = 0 n ∑ j = 1 ⌊ a n + b c ⌋ i [ a i + b ⩾ c j ] = ∑ i = 0 n ∑ j = 1 ⌊ a n + b c ⌋ i [ i ⩾ ⌈ c j − b a ⌉ ] = ∑ i = 0 n ∑ j = 1 ⌊ a n + b c ⌋ i [ i ⩾ ⌊ c j + a − b − 1 a ⌋ ] = ∑ j = 1 ⌊ a n + b c ⌋ ∑ i = 0 n i [ i ⩾ ⌊ c j + a − b − 1 a ⌋ ] = ∑ j = 1 ⌊ a n + b c ⌋ ∑ i = ⌊ c j + a − b − 1 a ⌋ n i = ∑ j = 1 ⌊ a n + b c ⌋ ( n + ⌊ c j + a − b − 1 a ⌋ ) ( n − ⌊ c j + a − b − 1 a ⌋ + 1 ) 2 = ∑ j = 1 ⌊ a n + b c ⌋ ( n + ⌊ c j − b − 1 a ⌋ + 1 ) ( n − ⌊ c j − b − 1 a ⌋ ) 2 = ∑ j = 0 ⌊ a n + b c ⌋ − 1 ( n + ⌊ c ( j + 1 ) − b − 1 a ⌋ + 1 ) ( n − ⌊ c ( j + 1 ) − b − 1 a ⌋ ) 2 = ∑ j = 0 ⌊ a n + b c ⌋ − 1 ( n + ⌊ c j + c − b − 1 a ⌋ + 1 ) ( n − ⌊ c j + c − b − 1 a ⌋ ) 2 = 1 2 ∑ j = 0 ⌊ a n + b c ⌋ − 1 [ n ( n + 1 ) − ⌊ c j + c − b − 1 a ⌋ − ⌊ c j + c − b − 1 a ⌋ 2 ] = 1 2 [ ∑ j = 0 ⌊ a n + b c ⌋ − 1 n ( n + 1 ) − ∑ j = 0 ⌊ a n + b c ⌋ − 1 ⌊ c j + c − b − 1 a ⌋ − ∑ j = 0 ⌊ a n + b c ⌋ − 1 ⌊ c j + c − b − 1 a ⌋ 2 ] = 1 2 [ ⌊ a n + b c ⌋ n ( n + 1 ) − f ( c , c − b − 1 , a , ⌊ a n + b c ⌋ − 1 ) − h ( c , c − b − 1 , a , ⌊ a n + b c ⌋ − 1 ) ] \begin{aligned}&g(a,b,c,n)=\sum\limits_{i=0}^n i\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor} i\\&=\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor} i\left[\left\lfloor\frac{ai+b}{c}\right\rfloor\geqslant j\right]\\&=\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor} i\left[ai+b \geqslant cj\right]\\&=\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor} i\left[i\geqslant\left\lceil\frac{cj-b}{a}\right\rceil\right]\\&=\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor} i\left[i\geqslant\left\lfloor\frac{cj+a-b-1}{a}\right\rfloor\right]\\&=\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\sum\limits_{i=0}^n i\left[i\geqslant\left\lfloor\frac{cj+a-b-1}{a}\right\rfloor\right]\\&=\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor} \sum_{i=\left\lfloor\frac{cj+a-b-1}{a}\right\rfloor}^n i\\&=\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\frac{\left(n+\left\lfloor\frac{cj+a-b-1}{a}\right\rfloor\right)\left(n-\left\lfloor\frac{cj+a-b-1}{a}\right\rfloor+1\right)}{2}\\&=\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\frac{\left(n+\left\lfloor\frac{cj-b-1}{a}\right\rfloor+1\right)\left(n-\left\lfloor\frac{cj-b-1}{a}\right\rfloor\right)}{2}\\&=\sum\limits_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\frac{\left(n+\left\lfloor\frac{c(j+1)-b-1}{a}\right\rfloor+1\right)\left(n-\left\lfloor\frac{c(j+1)-b-1}{a}\right\rfloor\right)}{2}\\&=\sum\limits_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\frac{\left(n+\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor+1\right)\left(n-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right)}{2}\\&=\frac{1}{2}\sum\limits_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\left[n(n+1)-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor^2\right]\\&=\frac{1}{2}\left[\sum\limits_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}n(n+1)-\sum\limits_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor-\sum\limits_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor^2\right]\\&=\frac{1}{2}\left[\left\lfloor\frac{an+b}{c}\right\rfloor n(n+1)-f\left(c,c-b-1,a,\left\lfloor\frac{an+b}{c}\right\rfloor-1\right)-h\left(c,c-b-1,a,\left\lfloor\frac{an+b}{c}\right\rfloor-1\right)\right]\end{aligned} g(a,b,c,n)=i=0nicai+b=i=0nj=1cai+bi=i=0nj=1can+bi[cai+bj]=i=0nj=1can+bi[ai+bcj]=i=0nj=1can+bi[iacjb]=i=0nj=1can+bi[iacj+ab1]=j=1can+bi=0ni[iacj+ab1]=j=1can+bi=acj+ab1ni=j=1can+b2(n+acj+ab1)(nacj+ab1+1)=j=1can+b2(n+acjb1+1)(nacjb1)=j=0can+b12(n+ac(j+1)b1+1)(nac(j+1)b1)=j=0can+b12(n+acj+cb1+1)(nacj+cb1)=21j=0can+b1[n(n+1)acj+cb1acj+cb12]=21j=0can+b1n(n+1)j=0can+b1acj+cb1j=0can+b1acj+cb12=21[can+bn(n+1)f(c,cb1,a,can+b1)h(c,cb1,a,can+b1)]
边界条件为,当 a = 0 a=0 a=0 时, g ( a , b , c , n ) = n ( n + 1 ) 2 ⌊ b c ⌋ g(a,b,c,n)=\frac{n(n+1)}{2}\left\lfloor\frac{b}{c}\right\rfloor g(a,b,c,n)=2n(n+1)cb

推导 h ( a , b , c , n ) h(a,b,c,n) h(a,b,c,n)

a ⩾ c a\geqslant c ac b ⩾ c b\geqslant c bc
h ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2 = ∑ i = 0 n [ ⌊ ( a   m o d   c ) i + ( b   m o d   c ) c ⌋ + ⌊ a c ⌋ i + ⌊ b c ⌋ ] 2 = ∑ i = 0 n ⌊ ( a   m o d   c ) i + ( b   m o d   c ) c ⌋ 2 + ∑ i = 0 n ⌊ a c ⌋ 2 i 2 + ∑ i = 0 n ⌊ b c ⌋ 2 + 2 ⌊ a c ⌋ ∑ i = 0 n ⌊ ( a   m o d   c ) i + ( b   m o d   c ) c ⌋ i + 2 ⌊ b c ⌋ ∑ i = 0 n ⌊ ( a   m o d   c ) i + ( b   m o d   c ) c ⌋ + 2 ⌊ a c ⌋ ⌊ b c ⌋ ∑ i = 0 n i = h ( a   m o d   c , b   m o d   c , c , n ) + 2 ⌊ a c ⌋ g ( a   m o d   c , b   m o d   c , c , n ) + 2 ⌊ b c ⌋ f ( a   m o d   c , b   m o d   c , c , n ) + n ( n + 1 ) ( 2 n + 1 ) 6 ⌊ a c ⌋ 2 + ( n + 1 ) ⌊ b c ⌋ 2 + n ( n + 1 ) ⌊ a c ⌋ ⌊ b c ⌋ \begin{aligned}&h(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\&=\sum\limits_{i=0}^n\left[\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor+\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor\right]^2\\&=\sum\limits_{i=0}^n\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor^2+\sum\limits_{i=0}^n\left\lfloor\frac{a}{c}\right\rfloor^2i^2+\sum\limits_{i=0}^n\left\lfloor\frac{b}{c}\right\rfloor^2\\&+2\left\lfloor\frac{a}{c}\right\rfloor\sum\limits_{i=0}^n\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor i+2\left\lfloor\frac{b}{c}\right\rfloor\sum\limits_{i=0}^n\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor+2\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{b}{c}\right\rfloor\sum\limits_{i=0}^n i\\&=h(a\bmod c,b\bmod c,c,n)+2\left\lfloor\frac{a}{c}\right\rfloor g(a\bmod c,b\bmod c,c,n)+2\left\lfloor\frac{b}{c}\right\rfloor f(a\bmod c,b\bmod c,c,n)\\&+\frac{n(n+1)(2n+1)}{6}\left\lfloor\frac{a}{c}\right\rfloor^2+(n+1)\left\lfloor\frac{b}{c}\right\rfloor^2+n(n+1)\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{b}{c}\right\rfloor\end{aligned} h(a,b,c,n)=i=0ncai+b2=i=0n[c(amodc)i+(bmodc)+cai+cb]2=i=0nc(amodc)i+(bmodc)2+i=0nca2i2+i=0ncb2+2cai=0nc(amodc)i+(bmodc)i+2cbi=0nc(amodc)i+(bmodc)+2cacbi=0ni=h(amodc,bmodc,c,n)+2cag(amodc,bmodc,c,n)+2cbf(amodc,bmodc,c,n)+6n(n+1)(2n+1)ca2+(n+1)cb2+n(n+1)cacb
a < c a<c a<c b < c b<c b<c
∀ x ∈ N + {\forall} x\in N^+ xN+,有如下骚操作 x 2 = 2 × x ( x + 1 ) 2 − x = 2 ∑ i = 1 x i − x x^2=2\times \frac{x(x+1)}{2}-x=2\sum\limits_{i=1}^xi -x x2=2×2x(x+1)x=2i=1xix
h ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2 = ∑ i = 0 n ( 2 ∑ j = 1 ⌊ a i + b c ⌋ j − ⌊ a i + b c ⌋ ) = 2 ∑ i = 0 n ∑ j = 1 ⌊ a i + b c ⌋ j − ∑ i = 0 n ⌊ a i + b c ⌋ = 2 ∑ i = 0 n ∑ j = 1 ⌊ a n + b c ⌋ j [ ⌊ a i + b c ⌋ ⩾ j ] − ∑ i = 0 n ⌊ a i + b c ⌋ = 2 ∑ i = 0 n ∑ j = 1 ⌊ a n + b c ⌋ j [ a i + b ⩾ c j ] − ∑ i = 0 n ⌊ a i + b c ⌋ = 2 ∑ i = 0 n ∑ j = 1 ⌊ a n + b c ⌋ j [ i ⩾ ⌈ c j − b a ⌉ ] − ∑ i = 0 n ⌊ a i + b c ⌋ = 2 ∑ j = 1 ⌊ a n + b c ⌋ j ∑ i = 0 n [ i ⩾ ⌈ c j − b a ⌉ ] − ∑ i = 0 n ⌊ a i + b c ⌋ = 2 ∑ j = 1 ⌊ a n + b c ⌋ j ∑ i = 0 n [ i ⩾ ⌊ c j + a − b − 1 a ⌋ ] − ∑ i = 0 n ⌊ a i + b c ⌋ = 2 ∑ j = 1 ⌊ a n + b c ⌋ [ j ( n − ⌊ c j + a − b − 1 a ⌋ + 1 ) ] − ∑ i = 0 n ⌊ a i + b c ⌋ = 2 ∑ j = 1 ⌊ a n + b c ⌋ [ j ( n − ⌊ c j − b − 1 a ⌋ ) ] − ∑ i = 0 n ⌊ a i + b c ⌋ = 2 ∑ j = 0 ⌊ a n + b c ⌋ − 1 [ ( j + 1 ) ( n − ⌊ c ( j + 1 ) − b − 1 a ⌋ ) ] − ∑ i = 0 n ⌊ a i + b c ⌋ = 2 ∑ j = 0 ⌊ a n + b c ⌋ − 1 [ ( j + 1 ) ( n − ⌊ c j + c − b − 1 a ⌋ ) ] − ∑ i = 0 n ⌊ a i + b c ⌋ = 2 n ∑ j = 0 ⌊ a n + b c ⌋ − 1 ( j + 1 ) − 2 ∑ j = 0 ⌊ a n + b c ⌋ − 1 j ⌊ c j + c − b − 1 a ⌋ − 2 ∑ j = 0 ⌊ a n + b c ⌋ − 1 ⌊ c j + c − b − 1 a ⌋ − ∑ i = 0 n ⌊ a i + b c ⌋ = ⌊ a n + b c ⌋ ( ⌊ a n + b c ⌋ + 1 ) n − 2 g ( c , c − b − 1 , a , ⌊ a n + b c ⌋ − 1 ) − 2 f ( c , c − b − 1 , a , ⌊ a n + b c ⌋ − 1 ) − f ( a , b , c , n ) \begin{aligned}&h(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\&=\sum\limits_{i=0}^n\left(2\sum\limits_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor}j-\left\lfloor\frac{ai+b}{c}\right\rfloor\right)\\&=2\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor}j-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=2\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}j\left[\left\lfloor\frac{ai+b}{c}\right\rfloor\geqslant j\right]-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=2\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}j\left[ai+b\geqslant cj\right]-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=2\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}j\left[i\geqslant\left\lceil\frac{cj-b}{a}\right\rceil\right]-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=2\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}j\sum\limits_{i=0}^{n}\left[i\geqslant\left\lceil\frac{cj-b}{a}\right\rceil\right]-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=2\sum\limits_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}j\sum\limits_{i=0}^{n}\left[i\geqslant\left\lfloor\frac{cj+a-b-1}{a}\right\rfloor\right]-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=2\sum_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\left[j\left(n-\left\lfloor\frac{cj+a-b-1}{a}\right\rfloor+1\right)\right]-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=2\sum_{j=1}^{\left\lfloor\frac{an+b}{c}\right\rfloor}\left[j\left(n-\left\lfloor\frac{cj-b-1}{a}\right\rfloor\right)\right]-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=2\sum_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\left[(j+1)\left(n-\left\lfloor\frac{c(j+1)-b-1}{a}\right\rfloor\right)\right]-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=2\sum_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\left[(j+1)\left(n-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right)\right]-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=2n\sum_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}(j+1)-2\sum_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}j\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor-2\sum_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\left\lfloor\frac{an+b}{c}\right\rfloor\left(\left\lfloor\frac{an+b}{c}\right\rfloor+1\right)n-2g\left(c,c-b-1,a,\left\lfloor\frac{an+b}{c}\right\rfloor-1\right)\\&-2f\left(c,c-b-1,a,\left\lfloor\frac{an+b}{c}\right\rfloor-1\right)-f(a,b,c,n)\end{aligned} h(a,b,c,n)=i=0ncai+b2=i=0n2j=1cai+bjcai+b=2i=0nj=1cai+bji=0ncai+b=2i=0nj=1can+bj[cai+bj]i=0ncai+b=2i=0nj=1can+bj[ai+bcj]i=0ncai+b=2i=0nj=1can+bj[iacjb]i=0ncai+b=2j=1can+bji=0n[iacjb]i=0ncai+b=2j=1can+bji=0n[iacj+ab1]i=0ncai+b=2j=1can+b[j(nacj+ab1+1)]i=0ncai+b=2j=1can+b[j(nacjb1)]i=0ncai+b=2j=0can+b1[(j+1)(nac(j+1)b1)]i=0ncai+b=2j=0can+b1[(j+1)(nacj+cb1)]i=0ncai+b=2nj=0can+b1(j+1)2j=0can+b1jacj+cb12j=0can+b1acj+cb1i=0ncai+b=can+b(can+b+1)n2g(c,cb1,a,can+b1)2f(c,cb1,a,can+b1)f(a,b,c,n)
边界条件为,当 a = 0 a=0 a=0 时, h ( a , b , c , n ) = ( n + 1 ) ⌊ b c ⌋ 2 h(a,b,c,n)=(n+1)\left\lfloor\frac{b}{c}\right\rfloor^2 h(a,b,c,n)=(n+1)cb2

洛谷 P5170 【模板】类欧几里得算法 ↬ \looparrowright

题目描述

给定 n , , a , b , c n,,a,b,c n,,a,b,c,分别求 ∑ i = 0 n ⌊ a i + b c ⌋ , ∑ i = 0 n ⌊ a i + b c ⌋ 2 , ∑ i = 0 n i ⌊ a i + b c ⌋ \sum\limits_{i=0}^n\left\lfloor \frac{ai+b}{c} \right\rfloor, \sum\limits_{i=0}^n\left\lfloor \frac{ai+b}{c} \right\rfloor^2,\sum\limits_{i=0}^ni\left\lfloor \frac{ai+b}{c} \right\rfloor i=0ncai+b,i=0ncai+b2,i=0nicai+b ,答案对 998244353 998244353 998244353 取模。多组数据。

输入格式

第一行给出数据组数 t t t
接下来 t t t 行,每行有四个整数,分别为每组数据的 n , a , b , c n, a, b, c n,a,b,c

输出格式

对于每组数据,输出一行三个整数,为三个答案对 998244353 998244353 998244353 取模的结果。

输入输出样例

输入 #1

2
2 1 0 2
4 3 9 6

输出 #1

1 1 2
11 27 27

说明/提示

本题采用 S p e c i a l   J u d g e \mathrm{Special}\ \mathrm{Judge} Special Judge
答对所有第一问可以获得测试点 40 % 40\% 40% 的分数,答对所有第二问、第三问可以分别获得另外 30 % 30\% 30% 的分数。

测试点编号特殊性质
1 1 1 n , a , b , c ⩽ 10 n,a,b,c\leqslant 10 n,a,b,c10
2 ∼ 3 2\sim3 23 n , a , b , c ⩽ 100 n,a,b,c\leqslant100 n,a,b,c100
4 4 4 n , a , b , c ⩽ 1 0 6 n,a,b,c\leqslant10^6 n,a,b,c106
5 5 5 t = 1 t=1 t=1
6 ∼ 10 6\sim10 610

对于所有测试点,有 1 ⩽ t ⩽ 1 0 5 ,   0 ⩽ n , a , b , c ⩽ 1 0 9 , c ≠ 0 1 \leqslant t \leqslant 10^5,\ 0 \leqslant n,a,b,c \leqslant 10^9, c \neq 0 1t105, 0n,a,b,c109,c=0

分析

在计算的时侯,因为三个函数各有交错递归,因此可以考虑三个函数打包成结构体一起整体递归,同步计算,否则有很多项会被多次计算。
类欧几里得算法时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)

代码

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const ll mod=998244353;
/*-----2,6的乘法逆元-----*/
const ll inv2=499122177;
const ll inv6=166374059;
/*-----用快速幂得到------*/
/*ll quick_pow(ll a,ll b)
{
	ll res=1;
	while(b)
	{
		if(b&1) res=res*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return res;
}
int main()
{
	cout<<quick_pow(2,mod-2)<<endl;
	cout<<quick_pow(6,mod-2)<<endl;
	return 0;
}*/
struct A//将答案打包成结构体
{
	ll f;
	ll g;
	ll h;
};
A cal(ll a,ll b,ll c,ll n)//按照以上推得的公式进行递归
{
	A res,temp;
	if(!a)
	{
		res.f=(n+1)*(b/c)%mod;
		res.g=(b/c)*n%mod*(n+1)%mod*inv2%mod;
		res.h=(n+1)*(b/c)%mod*(b/c)%mod;
	}
	else if(a>=c||b>=c)
	{
		temp=cal(a%c,b%c,c,n);
		res.f=((a/c)*n%mod*(n+1)%mod*inv2%mod
		+(b/c)*(n+1)%mod+temp.f)%mod;
		res.g=((a/c)*n%mod*(n+1)%mod*(2*n+1)%mod*inv6%mod
		+(b/c)*n%mod*(n+1)%mod*inv2%mod+temp.g)%mod;
		res.h=((a/c)*(a/c)%mod*n%mod*(n+1)%mod*(2*n+1)%mod*inv6%mod
		+(b/c)*(b/c)%mod*(n+1)%mod+(a/c)*(b/c)%mod*n%mod*(n+1)%mod
		+temp.h+2*(a/c)%mod*temp.g+2*(b/c)%mod*temp.f)%mod;
	}
	else
	{
		ll m=(a*n+b)/c;
		temp=cal(c,c-b-1,a,m-1);
		res.f=(n*(m%mod)%mod-temp.f)%mod;
		res.g=(n*(n+1)%mod*(m%mod)%mod-temp.f-temp.h)%mod*inv2%mod;
		res.h=(n*(m%mod)%mod*((m+1)%mod)%mod-2*temp.g-2*temp.f-res.f)%mod;
	}
	return res;
}
int main()
{
	int _;
	for(cin>>_;_;_--)
	{
		ll n,a,b,c;
		scanf("%lld%lld%lld%lld",&n,&a,&b,&c);
		A ans=cal(a,b,c,n);
		//注意负数的问题
		printf("%lld %lld %lld\n",(ans.f+mod)%mod,(ans.h+mod)%mod,(ans.g+mod)%mod);
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值