(本文用
绿
色
\color{green}绿色
绿 色 标注一切函数,用
紫
色
\color{purple}紫色
紫 色 标注部分可以
O
(
1
)
O(1)
O ( 1 ) 计算的常量式,便于观察)(不知道为什么加了颜色过后括号不能自动变大了,将就看吧= =)
概述
类欧几里得算法用于求形如
f
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
\color{green}{f(a, b, c, n)} \color{o} = \sum \limits_{i = 0}^{n} \left\lfloor \frac{a i + b}{c} \right\rfloor
f ( a , b , c , n ) = i = 0 ∑ n ⌊ c a i + b ⌋ 的式子。这个式子有个几何意义,表示求下图中阴影部分中的整点个数(直线为
y
=
a
x
+
b
y=ax+b
y = a x + b ):
算法
令
a
′
=
a
%
c
,
b
′
=
b
%
c
a' = a \% c, b' = b \% c
a ′ = a % c , b ′ = b % c ,由定义式得
f
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
(
⌊
a
′
i
+
b
′
c
⌋
+
⌊
a
c
⌋
i
+
⌊
b
c
⌋
)
=
f
(
a
′
,
b
′
,
c
,
n
)
+
⌊
a
c
⌋
∑
i
=
0
n
i
+
(
n
+
1
)
⌊
b
c
⌋
\begin{aligned} \color{green}{f(a, b, c, n)} \color{o} &= \sum_{i = 0}^{n} \left( \left\lfloor \frac{a' i + b'}{c} \right\rfloor + \left\lfloor \frac{a}{c} \right\rfloor i + \left\lfloor \frac{b}{c} \right\rfloor \right) \\ &= \color{green} f(a', b', c, n) \color{o} + \color{purple} \left\lfloor \frac{a}{c} \right\rfloor \sum_{i = 0}^{n} i \color{o} + \color{purple} (n + 1) \left\lfloor \frac{b}{c} \right\rfloor \end{aligned}
f ( a , b , c , n ) = i = 0 ∑ n ( ⌊ c a ′ i + b ′ ⌋ + ⌊ c a ⌋ i + ⌊ c b ⌋ ) = f ( a ′ , b ′ , c , n ) + ⌊ c a ⌋ i = 0 ∑ n i + ( n + 1 ) ⌊ c b ⌋ 于是只需要处理
a
,
b
<
c
a, b < c
a , b < c 的情况。
设
m
=
⌊
a
n
+
b
c
⌋
m = \left\lfloor \frac{a n + b}{c} \right\rfloor
m = ⌊ c a n + b ⌋ ,则
f
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
∑
j
=
0
m
[
j
≤
⌊
a
i
+
b
c
⌋
]
=
∑
i
=
0
n
∑
j
=
0
m
−
1
[
j
<
⌊
a
i
+
b
c
⌋
]
=
∑
j
=
0
m
−
1
∑
i
=
0
n
[
j
<
⌊
a
i
+
b
c
⌋
]
\begin{aligned} \color{green}{f(a, b, c, n)} \color{o} &= \sum_{i = 0}^{n} \sum_{j = 0}^{m} \left[ j \leq \left\lfloor \frac{a i + b}{c} \right\rfloor \right] \\ &= \sum_{i = 0}^{n} \sum_{j = 0}^{m - 1} \left[ j < \left\lfloor \frac{a i + b}{c} \right\rfloor \right] \\ &= \sum_{j = 0}^{m - 1} \sum_{i = 0}^{n} \left[ j < \left\lfloor \frac{a i + b}{c} \right\rfloor \right] \end{aligned}
f ( a , b , c , n ) = i = 0 ∑ n j = 0 ∑ m [ j ≤ ⌊ c a i + b ⌋ ] = i = 0 ∑ n j = 0 ∑ m − 1 [ j < ⌊ c a i + b ⌋ ] = j = 0 ∑ m − 1 i = 0 ∑ n [ j < ⌊ c a i + b ⌋ ]
现在要想办法把里面变成
i
i
i 为主元。 如下图所示,可以看出
0
≤
j
<
5
0 \leq j < 5
0 ≤ j < 5 ,结合图示可以得到
j
<
⌊
a
i
+
b
c
⌋
⇔
(
j
+
1
)
c
≤
a
i
+
b
j < \left\lfloor \frac{a i + b}{c} \right\rfloor \Leftrightarrow (j + 1) c \leq a i + b
j < ⌊ c a i + b ⌋ ⇔ ( j + 1 ) c ≤ a i + b 即
(
j
+
1
)
c
<
a
i
+
b
+
1
(j + 1) c < a i + b + 1
( j + 1 ) c < a i + b + 1 ,即
i
>
⌊
c
j
−
b
+
c
−
1
a
⌋
i > \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor
i > ⌊ a c j − b + c − 1 ⌋ 于是可以继续化简了
f
(
a
,
b
,
c
,
n
)
=
∑
j
=
0
m
−
1
∑
i
=
0
n
[
i
>
⌊
c
j
−
b
+
c
−
1
a
⌋
]
=
∑
j
=
0
m
−
1
(
n
−
⌊
c
j
−
b
+
c
−
1
a
⌋
)
=
m
n
−
∑
j
=
0
m
−
1
⌊
c
j
−
b
+
c
−
1
a
⌋
=
m
n
−
f
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
\begin{aligned} \color{green}{f(a, b, c, n)} \color{o} &= \sum_{j = 0}^{m - 1} \sum_{i = 0}^{n} \left[ i > \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor \right] \\ &= \sum_{j = 0}^{m - 1} \left( n - \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor\right) \\ &= \color{purple}{m n} \color{o} - \sum_{j = 0}^{m - 1} \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor \\ &= \color{purple}{m n} \color{o} - \color{green}{{}f(c, c - b - 1, a, m - 1)} \end{aligned}
f ( a , b , c , n ) = j = 0 ∑ m − 1 i = 0 ∑ n [ i > ⌊ a c j − b + c − 1 ⌋ ] = j = 0 ∑ m − 1 ( n − ⌊ a c j − b + c − 1 ⌋ ) = m n − j = 0 ∑ m − 1 ⌊ a c j − b + c − 1 ⌋ = m n − f ( c , c − b − 1 , a , m − 1 ) 仔细康康这个递推式,发现是由
f
(
a
,
b
,
c
,
n
)
f(a, b, c, n)
f ( a , b , c , n ) 变成了
f
(
c
,
c
−
b
%
c
−
1
,
a
%
c
,
m
−
1
)
f(c, c - b \% c - 1, a \% c, m - 1)
f ( c , c − b % c − 1 , a % c , m − 1 ) ,
a
,
c
a, c
a , c 两个参数的变化跟欧几里得算法一模一样,所以它的复杂度跟欧几里得求最大公约数的算法一样,也因此称它为类欧。
版题
洛谷P5170 【模板】类欧几里得算法
它还让你求
g
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
2
\color{green} g(a, b, c, n) \color{o} = \sum \limits_{i = 0}^{n} \left\lfloor \frac{a i + b}{c} \right\rfloor ^ 2
g ( a , b , c , n ) = i = 0 ∑ n ⌊ c a i + b ⌋ 2 ,以及
h
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
(
i
⌊
a
i
+
b
c
⌋
)
\color{green} h(a, b, c, n) \color{o} = \sum \limits_{i = 0}^{n} \left( i \left\lfloor \frac{a i + b}{c} \right\rfloor \right)
h ( a , b , c , n ) = i = 0 ∑ n ( i ⌊ c a i + b ⌋ ) ,直接刚,令
a
′
=
a
%
c
,
b
′
=
b
%
c
a' = a \%c, b' = b \% c
a ′ = a % c , b ′ = b % c :
g
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
(
⌊
a
′
i
+
b
′
c
⌋
+
⌊
a
c
⌋
i
+
⌊
b
c
⌋
)
2
=
g
(
a
′
,
b
′
,
c
,
n
)
+
⌊
a
c
⌋
2
∑
i
=
0
n
i
2
+
∑
i
=
0
n
⌊
b
c
⌋
2
+
2
∑
i
=
0
n
(
⌊
a
′
i
+
b
′
c
⌋
⌊
a
c
⌋
i
)
+
2
∑
i
=
0
n
(
⌊
a
′
i
+
b
′
c
⌋
⌊
b
c
⌋
)
+
2
∑
i
=
0
n
(
i
⌊
a
c
⌋
⌊
b
c
⌋
)
=
g
(
a
′
,
b
′
,
c
,
n
)
+
⌊
a
c
⌋
2
∑
i
=
0
n
i
2
+
∑
i
=
0
n
⌊
b
c
⌋
2
+
2
⌊
a
c
⌋
h
(
a
′
,
b
′
,
c
,
n
)
+
2
⌊
b
c
⌋
f
(
a
′
,
b
′
,
c
,
n
)
+
2
∑
i
=
0
n
(
i
⌊
a
c
⌋
⌊
b
c
⌋
)
=
g
(
a
′
,
b
′
,
c
,
n
)
+
2
⌊
a
c
⌋
h
(
a
′
,
b
′
,
c
,
n
)
+
2
⌊
b
c
⌋
f
(
a
′
,
b
′
,
c
,
n
)
+
∑
i
=
0
n
⌊
b
c
⌋
2
+
⌊
a
c
⌋
2
∑
i
=
0
n
i
2
+
2
∑
i
=
0
n
(
i
⌊
a
c
⌋
⌊
b
c
⌋
)
h
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
(
i
⌊
a
′
i
+
b
′
c
⌋
+
⌊
a
c
⌋
i
2
+
⌊
b
c
⌋
i
)
=
h
(
a
′
,
b
′
,
c
,
n
)
+
⌊
a
c
⌋
∑
i
=
0
n
i
2
+
⌊
b
c
⌋
∑
i
=
0
n
i
\begin{aligned} \color{green} g(a, b, c, n) \color{o} = &\sum \limits_{i = 0}^{n} \left( \left\lfloor \frac{a' i + b'}{c} \right\rfloor + \left\lfloor \frac{a}{c} \right\rfloor i + \left\lfloor \frac{b}{c} \right\rfloor\right)^2 \\ = &\color{green} g(a', b', c, n) \color{o} + \color{purple} \left\lfloor \frac{a}{c} \right\rfloor ^ 2 \sum \limits_{i = 0}^{n} i ^ 2 \color{o} + \color{purple} \sum \limits_{i = 0}^{n} \left\lfloor \frac{b}{c} \right\rfloor ^ 2 \color{o} + 2 \sum \limits_{i = 0}^{n} \left( \left\lfloor \frac{a' i + b'}{c} \right\rfloor \left\lfloor \frac{a}{c} \right\rfloor i \right) \\ &+ 2 \sum \limits_{i = 0}^{n} \left( \left\lfloor \frac{a' i + b'}{c} \right\rfloor \left\lfloor \frac{b}{c} \right\rfloor \right) + \color{purple}2 \sum \limits_{i = 0}^{n} \left( i\left\lfloor \frac{a}{c} \right\rfloor\left\lfloor \frac{b}{c} \right\rfloor\right) \\ = &\color{green} g(a', b', c, n) \color{o} + \color{purple} \left\lfloor \frac{a}{c} \right\rfloor ^ 2 \sum \limits_{i = 0}^{n} i ^ 2 \color{o} + \color{purple} \sum \limits_{i = 0}^{n} \left\lfloor \frac{b}{c} \right\rfloor ^ 2 \color{o} + \color{purple} 2 \left\lfloor \frac{a}{c} \right\rfloor \color{green} h(a', b', c, n) \\ &+ \color{purple} 2 \left\lfloor \frac{b}{c} \right\rfloor \color{green} f(a', b', c, n) \color{o} + \color{purple} 2 \sum \limits_{i = 0}^{n} \left( i \left\lfloor \frac{a}{c} \right\rfloor\left\lfloor \frac{b}{c} \right\rfloor\right) \\ = &\color{green} g(a', b', c, n) \color{o} + \color{purple} 2 \left\lfloor \frac{a}{c} \right\rfloor \color{green} h(a', b', c, n) + \color{purple} 2 \left\lfloor \frac{b}{c} \right\rfloor \color{green} f(a', b', c, n) \\ &\color{o} + \color{purple} \sum \limits_{i = 0}^{n} \left\lfloor \frac{b}{c} \right\rfloor ^ 2 \color{o} + \color{purple} \left\lfloor \frac{a}{c} \right\rfloor ^ 2 \sum \limits_{i = 0}^{n} i ^ 2 \color{o} + \color{purple} 2 \sum \limits_{i = 0}^{n} \left( i \left\lfloor \frac{a}{c} \right\rfloor\left\lfloor \frac{b}{c} \right\rfloor\right) \\ \color{green} h(a, b, c, n) \color{o} = &\sum \limits_{i = 0}^{n} \left( i \left\lfloor \frac{a' i + b'}{c} \right\rfloor + \left\lfloor \frac{a}{c} \right\rfloor i ^ 2 + \left\lfloor \frac{b}{c} \right\rfloor i \right) \\ = &\color{green} h(a', b', c, n) \color{o} + \color{purple} \left\lfloor \frac{a}{c} \right\rfloor \sum \limits_{i = 0}^{n} i ^ 2 \color{o} + \color{purple} \left\lfloor \frac{b}{c} \right\rfloor \sum \limits_{i = 0}^{n} i \end{aligned}
g ( a , b , c , n ) = = = = h ( a , b , c , n ) = = i = 0 ∑ n ( ⌊ c a ′ i + b ′ ⌋ + ⌊ c a ⌋ i + ⌊ c b ⌋ ) 2 g ( a ′ , b ′ , c , n ) + ⌊ c a ⌋ 2 i = 0 ∑ n i 2 + i = 0 ∑ n ⌊ c b ⌋ 2 + 2 i = 0 ∑ n ( ⌊ c a ′ i + b ′ ⌋ ⌊ c a ⌋ i ) + 2 i = 0 ∑ n ( ⌊ c a ′ i + b ′ ⌋ ⌊ c b ⌋ ) + 2 i = 0 ∑ n ( i ⌊ c a ⌋ ⌊ c b ⌋ ) g ( a ′ , b ′ , c , n ) + ⌊ c a ⌋ 2 i = 0 ∑ n i 2 + i = 0 ∑ n ⌊ c b ⌋ 2 + 2 ⌊ c a ⌋ h ( a ′ , b ′ , c , n ) + 2 ⌊ c b ⌋ f ( a ′ , b ′ , c , n ) + 2 i = 0 ∑ n ( i ⌊ c a ⌋ ⌊ c b ⌋ ) g ( a ′ , b ′ , c , n ) + 2 ⌊ c a ⌋ h ( a ′ , b ′ , c , n ) + 2 ⌊ c b ⌋ f ( a ′ , b ′ , c , n ) + i = 0 ∑ n ⌊ c b ⌋ 2 + ⌊ c a ⌋ 2 i = 0 ∑ n i 2 + 2 i = 0 ∑ n ( i ⌊ c a ⌋ ⌊ c b ⌋ ) i = 0 ∑ n ( i ⌊ c a ′ i + b ′ ⌋ + ⌊ c a ⌋ i 2 + ⌊ c b ⌋ i ) h ( a ′ , b ′ , c , n ) + ⌊ c a ⌋ i = 0 ∑ n i 2 + ⌊ c b ⌋ i = 0 ∑ n i 接下来考虑
a
,
b
<
c
a, b < c
a , b < c 的情况,这里有一个显然而神奇的变形:
x
2
=
2
⋅
x
(
x
+
1
)
2
−
x
=
2
∑
i
=
0
n
i
−
x
x^2 = 2 \cdot \frac{x(x + 1)}{2}-x = 2\sum_{i = 0}^{n} i - x
x 2 = 2 ⋅ 2 x ( x + 1 ) − x = 2 i = 0 ∑ n i − x 于是,令
m
=
⌊
a
n
+
b
c
⌋
m = \left\lfloor \frac{a n + b}{c} \right\rfloor
m = ⌊ c a n + b ⌋ :
g
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
2
=
∑
i
=
0
n
(
2
∑
j
=
0
⌊
a
i
+
b
c
⌋
j
−
⌊
a
i
+
b
c
⌋
)
=
2
∑
i
=
0
n
∑
j
=
0
⌊
a
i
+
b
c
⌋
j
−
f
(
a
,
b
,
c
,
n
)
=
2
∑
j
=
0
m
−
1
(
(
j
+
1
)
∑
i
=
0
n
[
j
<
⌊
a
i
+
b
c
⌋
]
)
−
f
(
a
,
b
,
c
,
n
)
=
2
∑
j
=
0
m
−
1
(
(
j
+
1
)
∑
i
=
0
n
[
i
>
⌊
c
j
−
b
+
c
−
1
a
⌋
]
)
−
f
(
a
,
b
,
c
,
n
)
=
2
∑
j
=
0
m
−
1
(
(
j
+
1
)
(
n
−
⌊
c
j
−
b
+
c
−
1
a
⌋
)
)
−
f
(
a
,
b
,
c
,
n
)
=
2
n
∑
j
=
0
m
−
1
(
j
+
1
)
−
2
∑
j
=
0
m
−
1
(
(
j
+
1
)
⌊
c
j
−
b
+
c
−
1
a
⌋
)
−
f
(
a
,
b
,
c
,
n
)
=
2
n
∑
j
=
0
m
−
1
(
j
+
1
)
−
2
(
h
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
+
f
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
)
−
f
(
a
,
b
,
c
,
n
)
h
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
(
i
⌊
a
i
+
b
c
⌋
)
=
∑
j
=
0
m
−
1
∑
i
=
0
n
(
i
[
j
<
⌊
a
i
+
b
c
⌋
]
)
=
∑
j
=
0
m
−
1
∑
i
=
0
n
(
i
[
i
<
⌊
c
j
−
b
+
c
−
1
a
⌋
]
)
=
∑
j
=
0
m
−
1
∑
i
=
⌊
c
j
−
b
+
c
−
1
a
⌋
+
1
n
i
=
∑
j
=
0
m
−
1
(
1
2
(
n
+
⌊
c
j
−
b
+
c
−
1
a
⌋
+
1
)
(
n
−
⌊
c
j
−
b
+
c
−
1
a
⌋
)
)
=
1
2
∑
j
=
0
m
−
1
(
n
(
n
+
1
)
)
+
1
2
n
∑
j
=
0
m
−
1
⌊
c
j
−
b
+
c
−
1
a
⌋
−
1
2
∑
j
=
0
m
−
1
⌊
c
j
−
b
+
c
−
1
a
⌋
2
−
1
2
(
n
+
1
)
∑
j
=
0
m
−
1
⌊
c
j
−
b
+
c
−
1
a
⌋
=
1
2
∑
j
=
0
m
−
1
(
n
(
n
+
1
)
)
+
1
2
g
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
−
1
2
f
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
\begin{aligned} \color{green}{g(a, b, c, n)} \color{black} = &\sum_{i = 0}^{n} \left\lfloor \frac{a i + b}{c} \right\rfloor ^ 2 \\ = &\sum_{i = 0}^{n} \left( 2 \sum_{j = 0}^{\left\lfloor \frac{a i + b}{c} \right\rfloor} j - \left\lfloor \frac{a i + b}{c} \right\rfloor\right) \\ = &2\sum_{i = 0}^{n} \sum_{j = 0}^{\left\lfloor \frac{a i + b}{c} \right\rfloor} j - \color{green} f(a, b, c, n) \\ = &2\sum_{j = 0}^{m - 1} \left( (j + 1)\sum_{i = 0}^{n} \left[ j < \left\lfloor \frac{a i + b}{c} \right\rfloor \right] \right) - \color{green} f(a, b, c, n) \\ = &2\sum_{j = 0}^{m - 1} \left( (j + 1)\sum_{i = 0}^{n} \left[ i > \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor \right] \right) - \color{green} f(a, b, c, n) \\ = &2\sum_{j = 0}^{m - 1} \left( (j + 1)(n - \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor) \right) - \color{green} f(a, b, c, n) \\ = &\color{purple} 2 n \sum_{j = 0}^{m - 1} (j + 1) \color{o} - 2\sum_{j = 0}^{m - 1} \left( (j + 1)\left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor \right) - \color{green} f(a, b, c, n) \\ = &\color{purple} 2 n \sum_{j = 0}^{m - 1} (j + 1) \color{o} - 2 (\color{green} h(c, c - b - 1, a, m - 1) \color{o} + \color{green} f(c, c - b - 1, a, m - 1) \color{o} ) - \color{green} f(a, b, c, n) \\ \color{green} h(a, b, c, n) \color{o} = &\sum \limits_{i = 0}^{n} \left( i \left\lfloor \frac{a i + b}{c} \right\rfloor \right) \\ = &\sum_{j = 0}^{m - 1} \sum_{i = 0}^{n} \left( i \left[ j < \left\lfloor \frac{a i + b}{c} \right\rfloor \right] \right) \\ = &\sum_{j = 0}^{m - 1} \sum_{i = 0}^{n} \left( i \left[ i < \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor \right] \right) \\ = &\sum_{j = 0}^{m - 1} \sum_{i = \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor + 1}^{n} i \\ = & \sum_{j = 0}^{m - 1} \left( \frac{1}{2} \left(n + \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor + 1 \right) \left(n - \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor \right) \right) \\ = &\color{purple} \frac{1}{2} \sum_{j = 0}^{m - 1} (n (n + 1)) \color{o} + \frac{1}{2} n \sum_{j = 0}^{m - 1} \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor - \frac{1}{2} \sum_{j = 0}^{m - 1}\left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor ^ 2 \\ &- \frac{1}{2} (n + 1) \sum_{j = 0}^{m - 1} \left\lfloor \frac{c j - b + c - 1}{a} \right\rfloor \\ = &\color{purple} \frac{1}{2} \sum_{j = 0}^{m - 1} (n (n + 1)) \color{o} + \color{purple}\frac{1}{2} \color{green} g(c, c - b - 1, a, m - 1) \color{o} - \color{purple}\frac{1}{2} \color{green} f(c, c - b - 1, a, m - 1) \end{aligned}
g ( a , b , c , n ) = = = = = = = = h ( a , b , c , n ) = = = = = = = i = 0 ∑ n ⌊ c a i + b ⌋ 2 i = 0 ∑ n ⎝ ⎜ ⎛ 2 j = 0 ∑ ⌊ c a i + b ⌋ j − ⌊ c a i + b ⌋ ⎠ ⎟ ⎞ 2 i = 0 ∑ n j = 0 ∑ ⌊ c a i + b ⌋ j − f ( a , b , c , n ) 2 j = 0 ∑ m − 1 ( ( j + 1 ) i = 0 ∑ n [ j < ⌊ c a i + b ⌋ ] ) − f ( a , b , c , n ) 2 j = 0 ∑ m − 1 ( ( j + 1 ) i = 0 ∑ n [ i > ⌊ a c j − b + c − 1 ⌋ ] ) − f ( a , b , c , n ) 2 j = 0 ∑ m − 1 ( ( j + 1 ) ( n − ⌊ a c j − b + c − 1 ⌋ ) ) − f ( a , b , c , n ) 2 n j = 0 ∑ m − 1 ( j + 1 ) − 2 j = 0 ∑ m − 1 ( ( j + 1 ) ⌊ a c j − b + c − 1 ⌋ ) − f ( a , b , c , n ) 2 n j = 0 ∑ m − 1 ( j + 1 ) − 2 ( h ( c , c − b − 1 , a , m − 1 ) + f ( c , c − b − 1 , a , m − 1 ) ) − f ( a , b , c , n ) i = 0 ∑ n ( i ⌊ c a i + b ⌋ ) j = 0 ∑ m − 1 i = 0 ∑ n ( i [ j < ⌊ c a i + b ⌋ ] ) j = 0 ∑ m − 1 i = 0 ∑ n ( i [ i < ⌊ a c j − b + c − 1 ⌋ ] ) j = 0 ∑ m − 1 i = ⌊ a c j − b + c − 1 ⌋ + 1 ∑ n i j = 0 ∑ m − 1 ( 2 1 ( n + ⌊ a c j − b + c − 1 ⌋ + 1 ) ( n − ⌊ a c j − b + c − 1 ⌋ ) ) 2 1 j = 0 ∑ m − 1 ( n ( n + 1 ) ) + 2 1 n j = 0 ∑ m − 1 ⌊ a c j − b + c − 1 ⌋ − 2 1 j = 0 ∑ m − 1 ⌊ a c j − b + c − 1 ⌋ 2 − 2 1 ( n + 1 ) j = 0 ∑ m − 1 ⌊ a c j − b + c − 1 ⌋ 2 1 j = 0 ∑ m − 1 ( n ( n + 1 ) ) + 2 1 g ( c , c − b − 1 , a , m − 1 ) − 2 1 f ( c , c − b − 1 , a , m − 1 )
代码 用结构体存,同步计算。 每个字符都要看清楚!
#include <cstdio>
typedef long long LL;
const LL MOD = 998244353 ;
const LL Inv2 = 499122177 , Inv6 = 166374059 ;
struct Data {
LL f, g, h;
Data ( ) { f = g = h = 0 ; }
Data ( LL _f, LL _g, LL _h) {
f = _f, g = _g, h = _h;
}
} ;
Data Euclid ( LL a, LL b, LL c, LL n) {
LL a1 = a / c, b1 = b / c, m = ( a * n + b) / c;
if ( a == 0 )
return Data ( b1 * ( n + 1 ) % MOD,
b1 * b1 % MOD * ( n + 1 ) % MOD,
b1 * n % MOD * ( n + 1 ) % MOD * Inv2 % MOD) ;
if ( a >= c || b >= c) {
Data T = Euclid ( a % c, b % c, c, n) ;
return Data ( ( T. f + a1 * n % MOD * ( n + 1 ) % MOD * Inv2 % MOD + ( n + 1 ) * b1 % MOD) % MOD,
( T. g + 2 * a1 % MOD * T. h % MOD + 2 * b1 % MOD * T. f % MOD + ( n + 1 ) * b1 % MOD * b1 % MOD + a1 * b1 % MOD * n % MOD * ( n + 1 ) % MOD + a1 * a1 % MOD * n % MOD * ( n + 1 ) % MOD * ( 2 * n + 1 ) % MOD * Inv6 % MOD) % MOD,
( T. h + a1 * n % MOD * ( n + 1 ) % MOD * ( 2 * n + 1 ) % MOD * Inv6 % MOD + b1 * n % MOD * ( n + 1 ) % MOD * Inv2 % MOD) % MOD) ;
}
Data T = Euclid ( c, c - b - 1 , a, m - 1 ) ;
Data R ( ( ( m * n % MOD - T. f) % MOD + MOD) % MOD, 0 , 0 ) ;
return Data ( R. f,
( ( n * m % MOD * ( m + 1 ) % MOD - 2 * T. h % MOD - 2 * T. f % MOD - R. f) % MOD + MOD) % MOD,
( ( m * n % MOD * ( n + 1 ) % MOD - T. g - T. f) % MOD + MOD) % MOD * Inv2 % MOD) ;
}
int main ( ) {
int T; scanf ( "%d" , & T) ;
while ( T-- ) {
int N, A, B, C;
scanf ( "%d%d%d%d" , & N, & A, & B, & C) ;
Data Ans = Euclid ( A, B, C, N) ;
printf ( "%lld %lld %lld\n" , Ans. f, Ans. g, Ans. h) ;
}
}
强推OI WiKi的类欧几里得算法 !