Solution
数列长度是 [ 1 , N ] [1, N] [1,N], 所有数的范围是 [ L , R ] [L, R] [L,R];
1 首先令数列长度为
n
n
n, 即
[
a
1
,
a
2
,
.
.
.
,
a
n
]
[a1, a2, ..., an]
[a1,a2,...,an];
2
.
1 等价修改数组–统一增加偏移量
.
.
所有元素统一减去
L
L
L (令
S
=
R
−
L
S = R-L
S=R−L), 即得到: 所有元素范围为
[
0
,
S
]
[0, S]
[0,S] (比如
[
R
,
R
,
R
,
R
]
[R, R, R, R]
[R,R,R,R] 对应为
[
S
,
S
,
S
,
S
]
[S, S,S,S]
[S,S,S,S]);
.
2 等价修改数组–转变为差分数组
.
.
即首元素不变, 其他元素令
a
i
=
a
i
−
a
i
−
1
a_i = a_i - a_{i-1}
ai=ai−ai−1;
比如原数组是
[
a
,
b
,
c
]
[a, b, c]
[a,b,c] (满足每个元素
∈
[
L
,
R
]
\in [L, R]
∈[L,R]), 令
S
=
R
−
L
S = R-L
S=R−L;
1
先转换为
[
a
−
L
,
b
−
L
,
c
−
L
]
[a-L, b-L, c-L]
[a−L,b−L,c−L] (满足每个元素
∈
[
0
,
S
]
\in [0, S]
∈[0,S])
2
再转换为
[
a
−
L
,
(
b
−
L
)
−
(
a
−
L
)
,
(
c
−
L
)
−
(
b
−
L
)
]
[a-L, (b-L)-(a-L), (c-L) - (b-L)]
[a−L,(b−L)−(a−L),(c−L)−(b−L)];
.
.
这个最终的数组 比如是
[
a
1
,
a
2
,
.
.
.
,
a
n
]
[a1, a2, ..., an]
[a1,a2,...,an] (注意, 这个数组并不一定是单调的), 它有个非常重要的性质:
∀
p
r
e
∈
[
1
,
n
]
,
∑
i
=
1
p
r
e
a
i
∈
[
0
,
S
]
\displaystyle \forall pre \in [1, n], \sum_{i=1}^{pre} a_i \in [0, S]
∀pre∈[1,n],i=1∑preai∈[0,S];
.
.
理解这个式子, 非常非常重要, 这个式子 和 最终的这个数组, 是完全等价的 充分必要条件;
因此, 我们求有多少个不同的数组方案, 其实就只关注 那个数组式子即可;
由于
∑
i
=
1
n
a
i
\sum_{i=1}^{n} a_i
∑i=1nai这个数组总和 是
[
0
,
S
]
[0, S]
[0,S]范围的, 不是确定的 我们再将他细分, 假设整个数组和是
s
s
s, 他的方案数 就对应为隔板法 (
s
s
s个小球 放入
n
n
n个盒子里, 且每个盒子
≥
0
\geq 0
≥0个, 方案数为
C
s
+
n
−
1
n
−
1
C_{s+n - 1}^{n-1}
Cs+n−1n−1)
n/s | 0 | 1 | 2 | … | s |
---|---|---|---|---|---|
1 | C(0,0) | C(1,0) | C(2,0) | … | C(S,0) |
2 | C(1,1) | C(2,1) | C(3,1) | … | C(S+1,1) |
3 | C(2,2) | C(3,2) | C(4,2) | … | C(S+2,2) |
… | … | … | … | … | … |
n | C(n-1,n-1) | C(n,n-1) | C(n+1,n-1) | … | C(n+S-1,n-1) |
应用: CSDN-129110790:@Mark_[0,1]
, 这里有两种方式解决:
.
注意行是
[
1
,
2
,
.
.
.
,
n
]
[1,2,...,n]
[1,2,...,n], 而列是
[
0
,
1
,
2
,
.
.
.
,
S
]
[0,1,2,...,S]
[0,1,2,...,S];
1 以每一列为单位, 单独处理, 对于单个列 去除首行 其他行可以运用公式合为一项;
.
第0列:
C
(
0
,
0
)
+
(
C
(
n
,
n
−
1
)
−
C
(
1
,
0
)
)
=
C
(
n
,
n
−
1
)
C(0,0) + ( C(n,n-1) - C(1,0)) = C(n, n-1)
C(0,0)+(C(n,n−1)−C(1,0))=C(n,n−1);
.
第1列:
C
(
1
,
0
)
+
(
C
(
n
+
1
,
n
−
1
)
−
C
(
2
,
0
)
)
=
C
(
n
+
1
,
n
−
1
)
C(1,0) + ( C(n+1,n-1) - C(2,0)) = C(n+1, n-1)
C(1,0)+(C(n+1,n−1)−C(2,0))=C(n+1,n−1);
.
…
.
第S列:
C
(
S
,
0
)
+
(
C
(
n
+
S
,
n
)
−
C
(
S
+
1
,
0
)
)
=
C
(
n
+
S
,
n
−
1
)
C(S,0) + ( C(n+S,n) - C(S+1,0)) = C(n+S, n-1)
C(S,0)+(C(n+S,n)−C(S+1,0))=C(n+S,n−1);
即,
C
(
n
,
n
−
1
)
+
C
(
n
+
1
,
n
−
1
)
+
.
.
.
+
C
(
n
+
S
,
n
−
1
)
C(n, n-1) + C(n+1, n-1) + ... + C(n+S, n-1)
C(n,n−1)+C(n+1,n−1)+...+C(n+S,n−1), 再运用公式, 得到
C
(
n
+
S
+
1
,
n
)
−
C
(
n
,
n
)
C(n+S+1, n) - C(n,n)
C(n+S+1,n)−C(n,n);
2 以每一行为单位, 单独处理, 对于单个行 去除首列 其他列可以运用公式合为一项;
.
第1行:
C
(
0
,
0
)
+
(
C
(
S
+
1
,
1
)
−
C
(
1
,
1
)
)
=
C
(
S
+
1
,
1
)
C(0,0) + ( C(S+1,1) - C(1,1)) = C(S+1, 1)
C(0,0)+(C(S+1,1)−C(1,1))=C(S+1,1);
.
第2行:
C
(
1
,
1
)
+
(
C
(
S
+
2
,
2
)
−
C
(
2
,
2
)
)
=
C
(
S
+
2
,
2
)
C(1,1) + ( C(S+2,2) - C(2,2)) = C(S+2, 2)
C(1,1)+(C(S+2,2)−C(2,2))=C(S+2,2);
.
…
.
第N行:
C
(
N
−
1
,
N
−
1
)
+
(
C
(
S
+
N
,
N
)
−
C
(
N
,
N
)
)
=
C
(
S
+
N
,
N
)
C(N-1,N-1) + ( C(S+N,N) - C(N,N)) = C(S+N, N)
C(N−1,N−1)+(C(S+N,N)−C(N,N))=C(S+N,N);
即,
C
(
S
+
1
,
1
)
+
C
(
S
+
2
,
2
)
+
.
.
.
+
C
(
S
+
N
,
N
)
C(S+1, 1) + C(S+2, 2) + ... + C(S+N, N)
C(S+1,1)+C(S+2,2)+...+C(S+N,N), 再运用公式, 得到
C
(
S
+
N
+
1
,
N
)
−
C
(
S
+
1
,
0
)
C(S+N+1, N) - C(S+1,0)
C(S+N+1,N)−C(S+1,0);
因此, 答案为
C
(
S
+
N
+
1
,
N
)
−
1
C(S+N+1,N) - 1
C(S+N+1,N)−1, 因为1e6 + 3
是个质数, 因此可以使用Lucas来求组合数;