设
s
u
m
(
S
)
sum(S)
sum(S) 表示集合
S
S
S 中所有元素的和。如果对于
S
S
S 的任意两个不相交子集
A
A
A和
B
B
B,如果他们满足:
(
1
)
.
s
u
m
(
A
)
(1).sum(A)
(1).sum(A)不等于
s
u
m
(
B
)
sum(B)
sum(B)
(
2
)
.
i
f
∣
A
∣
>
∣
B
∣
t
h
e
n
s
u
m
(
A
)
>
s
u
m
(
B
)
(2).if|A| > |B| then sum(A) > sum(B)
(2).if∣A∣>∣B∣thensum(A)>sum(B) 则称
S
S
S 是
R
R
R 集合。现在我们假设有一个大小为
N
N
N,元素互不相等的集合,已经满足了条件
(
2
)
(2)
(2),并且知道 所有元素之间的大小关系。问最坏情况下最少需要几次比较才能确定它是不是
R
R
R 集合。
N
<
=
1
e
4
N <= 1e4
N<=1e4
样例:4
输出:1
样例解释 : 设这个4 元集的元素是
a
1
<
a
2
<
a
3
<
a
4
a_1 < a_2 < a_3 < a_4
a1<a2<a3<a4,那么我们只需要比较
s
u
m
(
a
1
,
a
4
)
sum(a_1,a_4)
sum(a1,a4) 和
s
u
m
(
a
2
,
a
3
)
sum(a_2,a_3)
sum(a2,a3)。
建议先看懂样例解释之后再看题解:
因为
(
2
)
(2)
(2)条件已经满足,那么我们需要的就是对于大小相等且大于一的(不相交)集合对一一判定是否相等。
其中有一些是不需要判定就可以得出的,比如样例中的
(
1
,
2
)
与
(
3
,
4
)
,
(
1
,
3
)
与
(
2
,
4
)
(1,2)与(3,4),(1,3)与(2,4)
(1,2)与(3,4),(1,3)与(2,4)
找这种不需判定的方案的规律,发现应该是两个集合
A
,
B
A,B
A,B都从小到大排序,对于任意
x
x
x,
A
A
A中的
<
=
x
<=x
<=x的数的数量,都
<
=
,
B
<=,B
<=,B中的
<
=
x
<=x
<=x的数的数量。
马上想到卡特兰数。
因为对称性,不妨设
A
∪
B
A\cup B
A∪B中最小的元素在
A
A
A中。
那么不需判定的方案数就是
(
2
∣
A
∣
−
1
∣
A
∣
)
−
(
2
∣
A
∣
−
1
∣
A
∣
+
1
)
\binom{2|A|-1}{|A|} - \binom{2|A|-1}{|A|+1}
(∣A∣2∣A∣−1)−(∣A∣+12∣A∣−1),总方案是
(
2
∣
A
∣
−
1
∣
A
∣
)
\binom{2|A|-1}{|A|}
(∣A∣2∣A∣−1)(不懂的可以去膜卡特兰数的证明)
所以答案就是
∑
i
=
2
n
2
(
2
∣
A
∣
−
1
∣
A
∣
+
1
)
(
n
2
∣
A
∣
)
\sum_{i=2}^{\frac n2} \binom{2|A|-1}{|A|+1} \binom{n}{2|A|}
∑i=22n(∣A∣+12∣A∣−1)(2∣A∣n)
A C C o d e : \rm{AC \ Code:} AC Code:
fac = [0]*1005
def comb(a,b):
return fac[a]//fac[b]//fac[a-b]
n = int(input())
fac[0] = 1
for i in range(1,n+1):
fac[i] = fac[i-1] * i
result = 0
for i in range(2,n//2+1):
result += comb(n,2*i) * comb(2*i-1,i+1)
print(result)