和式的变换规则
容易证明,和式的变换符合如下规则:
1.交换律
例如:
∑
i
∈
k
a
i
=
∑
i
∈
p
(
k
)
a
i
\overset{}{\underset{i \in k}{\sum}}a_i=\overset{}{\underset{i \in p(k)}{\sum}}a_i
i∈k∑ai=i∈p(k)∑ai
p
(
k
)
p(k)
p(k)是指标集k的一个排列。
例如:
a
1
+
a
2
+
a
3
+
a
4
=
a
2
+
a
1
+
a
3
+
a
4
a_1+a_2+a_3+a_4=a_2+a_1+a_3+a_4
a1+a2+a3+a4=a2+a1+a3+a4
2.结合律
例如: ∑ i = 1 n a i + ∑ i = 1 n b i = ∑ i = 1 n a i + b i \overset{n}{\underset{i=1}{\sum}}a_i+\overset{n}{\underset{i=1}{\sum}}b_i=\overset{n}{\underset{i=1}{\sum}}a_i+b_i i=1∑nai+i=1∑nbi=i=1∑nai+bi
3.分配律
例如: ∑ i c ⋅ a i = c ⋅ ∑ i a i \overset{}{\underset{i}{\sum}}c\cdot a_i=c \cdot \overset{}{\underset{i}{\sum}}a_i i∑c⋅ai=c⋅i∑ai
和式的变换技术
令 n ≤ m n\leq m n≤m:
1.替换条件式
∑
d
∣
g
c
d
(
i
,
j
)
f
(
d
)
=
∑
d
=
1
min
(
i
,
j
)
[
d
∣
i
]
[
d
∣
j
]
f
(
d
)
\overset{}{\underset{d|gcd(i,j)}{\sum}}f(d)=\overset{\min(i,j)}{\underset{d=1}{\sum}}[d|i][d|j]f(d)
d∣gcd(i,j)∑f(d)=d=1∑min(i,j)[d∣i][d∣j]f(d)
把写在求和符号下标位置的命题改为艾弗森括号的形式,使得命题可以随意变换位置,是一种常见的技巧。
把枚举次序复杂的求和式改为顺序求和式,便于处理(如通过前缀和预处理),也是一种常见的技巧。
2.替换指标变量
∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = k ] = ∑ i k = 1 n ∑ j k = 1 m [ g c d ( i k , j k ) = k ] = ∑ i k = 1 n ∑ j k = 1 m [ g c d ( i , j ) = 1 ] \overset{n}{\underset{i=1}{\sum}}\overset{m}{\underset{j=1}{\sum}}[gcd(i,j)=k]=\overset{n}{\underset{ik=1}{\sum}}\overset{m}{\underset{jk=1}{\sum}}[gcd(ik,jk)=k]=\overset{n}{\underset{ik=1}{\sum}}\overset{m}{\underset{jk=1}{\sum}}[gcd(i,j)=1] i=1∑nj=1∑m[gcd(i,j)=k]=ik=1∑njk=1∑m[gcd(ik,jk)=k]=ik=1∑njk=1∑m[gcd(i,j)=1]
∑ i = 0 n ( − 1 ) n − i f ( n − i ) = ∑ i = 0 n ( − 1 ) i f ( i ) \overset{n}{\underset{i=0}{\sum}}(-1)^{n-i}f(n-i)=\overset{n}{\underset{i=0}{\sum}}(-1)^if(i) i=0∑n(−1)n−if(n−i)=i=0∑n(−1)if(i)
3.改变求和次序
∑ i ∑ j f ( i ) g ( j ) = ∑ j ∑ i f ( i ) g ( j ) \overset{}{\underset{i}{\sum}}\overset{}{\underset{j}{\sum}}f(i)g(j)=\overset{}{\underset{j}{\sum}}\overset{}{\underset{i}{\sum}}f(i)g(j) i∑j∑f(i)g(j)=j∑i∑f(i)g(j)
复杂的改变求和次序
为了改变求和次序,有时候我们可能需要通过解不等式的方法。
例如:
∑
i
=
1
n
∑
j
=
1
i
f
(
i
,
j
)
\overset{n}{\underset{i=1}{\sum}}\overset{i}{\underset{j=1}{\sum}}f(i,j)
i=1∑nj=1∑if(i,j)
=
∑
i
∑
j
f
(
i
,
j
)
[
1
≤
i
]
[
i
≤
n
]
[
1
≤
j
]
[
j
≤
i
]
=\textcolor{red}{\overset{}{\underset{i}{\sum}}}\textcolor{blue}{\overset{}{\underset{j}{\sum}}}f(i,j)\textcolor{red}{[1\leq i][i\leq n]}\textcolor{blue}{[1\leq j][j\leq i]}
=i∑j∑f(i,j)[1≤i][i≤n][1≤j][j≤i]
我们知道 j ≤ i ≤ n j\leq i\leq n j≤i≤n:
=
∑
i
∑
j
f
(
i
,
j
)
[
j
≤
i
]
[
i
≤
n
]
[
1
≤
j
]
[
j
≤
n
]
=\textcolor{red}{\overset{}{\underset{i}{\sum}}}\textcolor{blue}{\overset{}{\underset{j}{\sum}}}f(i,j)\textcolor{red}{[j\leq i][i\leq n]}\textcolor{blue}{[1\leq j][j\leq n]}
=i∑j∑f(i,j)[j≤i][i≤n][1≤j][j≤n]
=
∑
j
∑
i
f
(
i
,
j
)
[
j
≤
i
]
[
i
≤
n
]
[
1
≤
j
]
[
j
≤
n
]
=\textcolor{blue}{\overset{}{\underset{j}{\sum}}}\textcolor{red}{\overset{}{\underset{i}{\sum}}}f(i,j)\textcolor{red}{[j\leq i][i\leq n]}\textcolor{blue}{[1\leq j][j\leq n]}
=j∑i∑f(i,j)[j≤i][i≤n][1≤j][j≤n]
= ∑ j = 1 n ∑ i = j n f ( i , j ) =\overset{n}{\underset{j=1}{\sum}}\overset{n}{\underset{i=j}{\sum}}f(i,j) =j=1∑ni=j∑nf(i,j)
又例如:
∑
i
=
1
n
∑
j
=
i
+
1
n
f
(
i
,
j
)
\overset{n}{\underset{i=1}{\sum}}\overset{n}{\underset{j=i+1}{\sum}}f(i,j)
i=1∑nj=i+1∑nf(i,j)
=
∑
i
∑
j
f
(
i
,
j
)
[
1
≤
i
]
[
i
≤
n
]
[
i
+
1
≤
j
]
[
j
≤
n
]
=\overset{}{\underset{i}{\sum}}\overset{}{\underset{j}{\sum}}f(i,j)[1\leq i][i\leq n][i+1\leq j][j\leq n]
=i∑j∑f(i,j)[1≤i][i≤n][i+1≤j][j≤n]
因此
j
j
j的枚举下界是
j
≥
i
+
1
≥
2
j\geq i+1\geq 2
j≥i+1≥2,而我们解第三个不等式可以知道
i
≤
j
−
1
i\leq j-1
i≤j−1。
即:
{
1
≤
i
i
≤
j
−
1
i
≤
n
2
≤
j
j
≤
n
\left\{\begin{matrix} 1\leq i\;\;\;\;\;\;\;\\ i\leq j-1\\ i\leq n\;\;\;\;\;\;\\ 2\leq j\;\;\;\;\;\;\\ j\leq n\;\;\;\;\;\; \end{matrix}\right.
⎩
⎨
⎧1≤ii≤j−1i≤n2≤jj≤n
对答案取交集,则:
=
∑
i
∑
j
f
(
i
,
j
)
[
1
≤
i
]
[
i
≤
j
−
1
]
[
2
≤
j
]
[
j
≤
n
]
=\overset{}{\underset{i}{\sum}}\overset{}{\underset{j}{\sum}}f(i,j)[1\leq i][i\leq j-1][2\leq j][j\leq n]
=i∑j∑f(i,j)[1≤i][i≤j−1][2≤j][j≤n]
=
∑
j
∑
i
f
(
i
,
j
)
[
1
≤
i
]
[
i
≤
j
−
1
]
[
2
≤
j
]
[
j
≤
n
]
=\overset{}{\underset{j}{\sum}}\overset{}{\underset{i}{\sum}}f(i,j)[1\leq i][i\leq j-1][2\leq j][j\leq n]
=j∑i∑f(i,j)[1≤i][i≤j−1][2≤j][j≤n]
=
∑
j
=
2
n
∑
i
=
1
j
−
1
f
(
i
,
j
)
=\overset{n}{\underset{j=2}{\sum}}\overset{j-1}{\underset{i=1}{\sum}}f(i,j)
=j=2∑ni=1∑j−1f(i,j)
4.分离变量
∑ i ∑ i f ( i ) g ( j ) = ∑ i f ( i ) ∑ j g ( j ) \overset{}{\underset{i}{\sum}}\overset{}{\underset{i}{\sum}}f(i)g(j)=\overset{}{\underset{i}{\sum}}f(i)\overset{}{\underset{j}{\sum}}g(j) i∑i∑f(i)g(j)=i∑f(i)j∑g(j)
5.改变枚举范围
扩大枚举范围
∑ i = 1 n ∑ j = 1 m ∑ d ∣ g c d ( i , j ) f ( d ) = ∑ i = 1 n ∑ j = 1 m ∑ d = 1 min ( i , j ) [ d ∣ i ] [ d ∣ j ] f ( d ) \overset{n}{\underset{i=1}{\sum}}\overset{m}{\underset{j=1}{\sum}}\overset{}{\underset{d|gcd(i,j)}{\sum}}f(d)=\overset{n}{\underset{i=1}{\sum}}\overset{m}{\underset{j=1}{\sum}}\overset{\min(i,j)}{\underset{d=1}{\sum}}[d|i][d|j]f(d) i=1∑nj=1∑md∣gcd(i,j)∑f(d)=i=1∑nj=1∑md=1∑min(i,j)[d∣i][d∣j]f(d)
我们注意到,如果 d > i d>i d>i,则 [ d ∣ i ] [d|i] [d∣i]必定为0,因此最后一个求和符号的枚举上界可以改变:
∑ i = 1 n ∑ j = 1 m ∑ d = 1 min ( i , j ) [ d ∣ i ] [ d ∣ j ] f ( d ) = ∑ i = 1 n ∑ j = 1 m ∑ d = 1 n [ d ∣ i ] [ d ∣ j ] f ( d ) \overset{n}{\underset{i=1}{\sum}}\overset{m}{\underset{j=1}{\sum}}\overset{\min(i,j)}{\underset{d=1}{\sum}}[d|i][d|j]f(d)=\overset{n}{\underset{i=1}{\sum}}\overset{m}{\underset{j=1}{\sum}}\overset{n}{\underset{d=1}{\sum}}[d|i][d|j]f(d) i=1∑nj=1∑md=1∑min(i,j)[d∣i][d∣j]f(d)=i=1∑nj=1∑md=1∑n[d∣i][d∣j]f(d)
扩大范围可以将于变量有关的枚举上界改变为常量,便于进行处理,是一个常见技巧。
这是由于我们注意到,一些变量的枚举范围被重复限制了多次,这是没有必要的,只需要让变量的枚举范围被限制一次就好了。
缩小枚举范围
∑
i
=
1
n
∑
j
=
1
m
[
g
c
d
(
i
,
j
)
=
k
]
=
∑
i
k
=
1
n
∑
j
k
=
1
m
[
g
c
d
(
i
k
,
j
k
)
=
k
]
=
∑
i
k
=
1
n
∑
j
k
=
1
m
[
g
c
d
(
i
,
j
)
=
1
]
=
∑
i
=
1
⌊
n
k
⌋
∑
j
=
1
⌊
m
k
⌋
[
g
c
d
(
i
,
j
)
=
1
]
\overset{n}{\underset{i=1}{\sum}}\overset{m}{\underset{j=1}{\sum}}[gcd(i,j)=k]=\overset{n}{\underset{ik=1}{\sum}}\overset{m}{\underset{jk=1}{\sum}}[gcd(ik,jk)=k]=\overset{n}{\underset{ik=1}{\sum}}\overset{m}{\underset{jk=1}{\sum}}[gcd(i,j)=1]=\overset{\lfloor\frac n k \rfloor}{\underset{i=1}{\sum}}\overset{\lfloor\frac m k\rfloor }{\underset{j=1}{\sum}}[gcd(i,j)=1]
i=1∑nj=1∑m[gcd(i,j)=k]=ik=1∑njk=1∑m[gcd(ik,jk)=k]=ik=1∑njk=1∑m[gcd(i,j)=1]=i=1∑⌊kn⌋j=1∑⌊km⌋[gcd(i,j)=1]
在最后一步,我们缩小了枚举范围,对于i来说,事实上是:
1
≤
i
k
≤
n
1\leq ik\leq n
1≤ik≤n 就是
⌊
1
k
⌋
≤
i
≤
⌊
n
k
⌋
\lfloor\frac 1 k \rfloor\leq i\leq\lfloor\frac n k\rfloor
⌊k1⌋≤i≤⌊kn⌋,由于i要取整,因此:
1
≤
i
≤
⌊
n
k
⌋
1\leq i\leq\lfloor\frac n k\rfloor
1≤i≤⌊kn⌋
缩小枚举范围使得枚举条件简化,也是一个常见技巧。
示例
设组合数
(
j
i
)
(^i_j)
(ji)表示从i个不同的物品中取出j个,不考虑取出的顺序,有多少种情况数。
显然
(
j
i
)
=
0
(
j
>
i
或
j
<
0
或
i
<
0
)
(^i_j)=0(j>i或j<0或i<0)
(ji)=0(j>i或j<0或i<0)
则有:
∑
i
=
0
n
−
1
(
i
n
−
1
)
n
i
+
1
+
∑
i
=
0
n
−
1
(
i
n
−
1
)
n
i
\overset{n-1}{\underset{i=0}{\sum}}(^{n-1}_{\;\;i})n^{i+1}+\overset{n-1}{\underset{i=0}{\sum}}(^{n-1}_{\;\;i})n^{i}
i=0∑n−1(in−1)ni+1+i=0∑n−1(in−1)ni
首先注意到
n
−
1
n-1
n−1作为上标不太好,考虑到
(
n
n
−
1
)
=
0
(_{\;\;n}^{n-1})=0
(nn−1)=0:
=
∑
i
=
0
n
(
i
n
−
1
)
n
i
+
1
+
∑
i
=
0
n
(
i
n
−
1
)
n
i
=\overset{n}{\underset{i=0}{\sum}}(^{n-1}_{\;\;i})n^{i+1}+\overset{n}{\underset{i=0}{\sum}}(^{n-1}_{\;\;i})n^{i}
=i=0∑n(in−1)ni+1+i=0∑n(in−1)ni
接下来发现
n
i
+
1
n^{i+1}
ni+1与
n
i
n^i
ni不太好合并,由于
(
−
1
n
−
1
)
=
0
(^{n-1}_{-1})=0
(−1n−1)=0,可以把左和式的i全部换成i-1,此时发现枚举上界不变:
=
∑
i
=
0
n
(
i
−
1
n
−
1
)
n
i
+
∑
i
=
0
n
(
i
n
−
1
)
n
i
=
∑
i
=
0
n
(
(
i
−
1
n
−
1
)
+
(
i
n
−
1
)
)
n
i
=\overset{n}{\underset{i=0}{\sum}}(^{n-1}_{i-1})n^{i}+\overset{n}{\underset{i=0}{\sum}}(^{n-1}_{\;\;i})n^{i}=\overset{n}{\underset{i=0}{\sum}}\left((^{n-1}_{i-1})+(^{n-1}_{\;\;i})\right)n^{i}
=i=0∑n(i−1n−1)ni+i=0∑n(in−1)ni=i=0∑n((i−1n−1)+(in−1))ni
和式的变换公式
容易证明:
公式1
(
∑
i
=
1
n
a
i
)
2
=
∑
i
=
1
n
a
i
2
+
2
∑
1
≤
i
<
j
≤
n
a
i
a
j
\left(\overset{n}{\underset{i=1}{\sum}}a_i\right)^2=\overset{n}{\underset{i=1}{\sum}}a_i^2+2\overset{}{\underset{1\leq i <j \leq n}{\sum}}a_ia_j
(i=1∑nai)2=i=1∑nai2+21≤i<j≤n∑aiaj
这个式子似乎没什么用。
公式2
∑
1
≤
i
<
j
≤
n
(
a
i
−
a
j
)
2
=
n
∑
i
=
1
n
a
i
2
−
(
∑
i
=
1
n
a
i
)
2
\overset{}{\underset{1\leq i<j\leq n}{\sum}}(a_i-a_j)^2=n\overset{n}{\underset{i=1}{\sum}}a_i^2-\left(\overset{n}{\underset{i=1}{\sum}}a_i\right)^2
1≤i<j≤n∑(ai−aj)2=ni=1∑nai2−(i=1∑nai)2
这个公式也显得很鸡肋,因为其实优化不了时间复杂度,直接把上面的式子拆开,然后前缀和优化一波也能O(n)做。
证明也很容易:
∑
1
≤
i
<
j
≤
n
(
a
i
−
a
j
)
2
=
∑
1
≤
i
<
j
≤
n
a
i
2
+
a
j
2
−
2
a
i
a
j
\overset{}{\underset{1\leq i<j\leq n}{\sum}}(a_i-a_j)^2=\overset{}{\underset{1\leq i<j\leq n}{\sum}}a_i^2+a_j^2-2a_ia_j
1≤i<j≤n∑(ai−aj)2=1≤i<j≤n∑ai2+aj2−2aiaj
尽量让一个和式只声明一个变量,可以把和式拆开:
=
∑
i
=
1
n
∑
1
≤
j
<
i
a
i
2
+
a
j
2
−
2
a
i
a
j
=\overset{n}{\underset{i=1}{\sum}}\overset{}{\underset{\;1\leq j <i}{\sum}}a_i^2+a_j^2-2a_ia_j
=i=1∑n1≤j<i∑ai2+aj2−2aiaj
=
∑
i
=
1
n
∑
1
≤
j
<
i
a
i
2
+
∑
i
=
1
n
∑
1
≤
j
<
i
a
j
2
−
2
∑
i
=
1
n
∑
1
≤
j
<
i
a
i
⋅
a
j
=\overset{n}{\underset{i=1}{\sum}}\overset{}{\underset{\;1\leq j <i}{\sum}}a_i^2+\overset{n}{\underset{i=1}{\sum}}\overset{}{\underset{\;1\leq j <i}{\sum}}a_j^2-2\overset{n}{\underset{i=1}{\sum}}\overset{}{\underset{\;1\leq j <i}{\sum}}a_i\cdot a_j
=i=1∑n1≤j<i∑ai2+i=1∑n1≤j<i∑aj2−2i=1∑n1≤j<i∑ai⋅aj
发现第三个式子可以套进第一个公式里:
=
∑
i
=
1
n
∑
1
≤
j
<
i
a
i
2
+
∑
i
=
1
n
∑
1
≤
j
<
i
a
j
2
+
∑
i
=
1
n
a
i
2
−
(
∑
i
=
1
n
a
i
)
2
=\overset{n}{\underset{i=1}{\sum}}\overset{}{\underset{\;1\leq j <i}{\sum}}a_i^2+\overset{n}{\underset{i=1}{\sum}}\overset{}{\underset{\;1\leq j <i}{\sum}}a_j^2+\overset{n}{\underset{i=1}{\sum}}a_i^2-\left(\overset{n}{\underset{i=1}{\sum}}a_i\right)^2
=i=1∑n1≤j<i∑ai2+i=1∑n1≤j<i∑aj2+i=1∑nai2−(i=1∑nai)2
然后我们发现,前面三项都是一个基于
a
i
2
a_i^2
ai2的贡献.
第一项对答案的贡献是
∑
{
0
⋅
a
1
2
,
1
⋅
a
2
2
,
2
⋅
a
3
2
,
.
.
.
,
(
n
−
1
)
⋅
a
n
2
}
\sum\left \{ 0\cdot a_1^2,1 \cdot a_2^2,2 \cdot a_3^2,...,(n-1)\cdot a_n^2 \right \}
∑{0⋅a12,1⋅a22,2⋅a32,...,(n−1)⋅an2}
第二项对答案的贡献是
∑
{
(
n
−
1
)
⋅
a
1
2
,
(
n
−
2
)
⋅
a
2
2
,
(
n
−
3
)
⋅
a
3
2
,
.
.
.
,
0
⋅
a
n
2
}
\sum\left \{ (n-1)\cdot a_1^2,(n-2) \cdot a_2^2,(n-3) \cdot a_3^2,...,0\cdot a_n^2 \right \}
∑{(n−1)⋅a12,(n−2)⋅a22,(n−3)⋅a32,...,0⋅an2}
加上第三项,恰好每一项的平方对答案的贡献就是
n
⋅
a
i
2
n\cdot a_i^2
n⋅ai2:
=
n
∑
i
=
1
n
a
i
2
−
(
∑
i
=
1
n
a
i
)
2
=n\overset{n}{\underset{i=1}{\sum}}a_i^2-\left(\overset{n}{\underset{i=1}{\sum}}a_i\right)^2
=ni=1∑nai2−(i=1∑nai)2
QED.
当然,把减号变成加号的话,直接前缀和优化一波,也是可以做的。
这个公式的高维形式与第一个公式密切相关,似乎就要涉及到多项式定理了,等我四月之后研究一下。
阿贝尔部分求和公式
∑ i = 1 n a i b i = b n ∑ i = 1 n a i + ∑ k = 1 n − 1 ( ∑ i = 1 k a i ) ( b k − b k + 1 ) \overset{n}{\underset{i=1}{\sum}}a_ib_i=b_n\overset{n}{\underset{i=1}{\sum}}a_i+\overset{n-1}{\underset{k=1}{\sum}}\left(\overset{k}{\underset{i=1}{\sum}}a_i\right)(b_k-b_{k+1}) i=1∑naibi=bni=1∑nai+k=1∑n−1(i=1∑kai)(bk−bk+1)
这个式子也是中看不中用,你可能觉得直接暴力枚举右边是O(n2),可以转化到左边是O(n)。但事实上右边直接用前缀和优化,也可以到O(n)。
但是这个式子思路确实特别巧妙,考虑一下证明:
首先观察最后那个二重和式:
这其实是在说,对于和式的值,每个
a
i
a_i
ai都与
b
k
b_k
bk做一个正的贡献,再与
b
k
+
1
b_{k+1}
bk+1做一个负的贡献。等到下一次
a
i
a_i
ai与
b
k
+
1
,
b
k
+
2
b_{k+1},b_{k+2}
bk+1,bk+2做贡献的时候,
a
i
a_i
ai与
b
k
+
1
b_{k+1}
bk+1做的贡献就被抵消了。
唯二没被抵消的贡献之一就是 a k a_k ak与 b k b_k bk做的贡献,因为并没有 b k − 1 b_{k-1} bk−1来抵消它。
剩下一个多算的地方就是当k=n-1时,计算的
a
i
a_i
ai与
b
k
+
1
b_{k+1}
bk+1的负的贡献,前面加了一项
b
n
∑
i
=
1
n
a
i
b_n\overset{n}{\underset{i=1}{\sum}}a_i
bni=1∑nai来抵消它。
QED.
这个公式难写出高维形式。
后记
于是皆大欢喜。