BZOJ 2155 R集合(不是Xor) (卡特兰数,Python)

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).ifA>Bthensum(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 AB中最小的元素在 A A A中。
那么不需判定的方案数就是 ( 2 ∣ A ∣ − 1 ∣ A ∣ ) − ( 2 ∣ A ∣ − 1 ∣ A ∣ + 1 ) \binom{2|A|-1}{|A|} - \binom{2|A|-1}{|A|+1} (A2A1)(A+12A1),总方案是 ( 2 ∣ A ∣ − 1 ∣ A ∣ ) \binom{2|A|-1}{|A|} (A2A1)(不懂的可以去膜卡特兰数的证明)
所以答案就是 ∑ 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+12A1)(2An)

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)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值