ZXA AND SET HDU - 5680 组合数学

题意

zxa有一个集合\(A={a_1,a_2,?,a_n}\),n表示集合A的元素个数,这个集合明显有\((2^n?1)\)个非空子集合。

对于每个属于A的子集合\(B={b_1,b_2,?,b_m} (1≤m≤n)B={b_1,b_2,?,b_m}(1≤m≤n)\),m表示集合B的元素个数,zxa定义它的价值是\(min(b_1,b_2,?,b_m)\)

zxa很好奇,如果令\(S_{odd}\)表示集合A的所有含奇数个元素的非空子集合的价值之和,\(S_{even}\)表示集合AA的所有含偶数个元素的非空子集合的价值之和,那么\(|S_{odd}?S_{even}|\)是多少,你能帮助他吗?

思路

  • 貌似大家都可以观察出来,我并没有观察出来,看来以后要多观察观察,噫吁戱。
  • 用组合数学推了一下,乱七八糟的
    • 将A数组sort一下,非降序排序。
    • X: 小于等于n的最大偶数,Y: 小于等于n的最大奇数
    • \(S_{odd} = \sum_{i=1}^n{a_i * (C_{n-i}^{0} + C_{n-i}^2 +...+C_{n-i}^X)}\)
    • \(S_{even} = \sum_{i=1}^n{a_i * (C_{n-i}^{1} + C_{n-i}^3 +...+C_{n-i}^Y)}\)
    • \(|S_{odd}-S_{even}|\)的时候你就会发现很多居然可以抵消!
    • \(|S_{odd}-S_{even}| = |\sum_{i=1}^n[{a_i}*(C_k^0 - C_k^1 + ... +(-1)^i*C_k^i+...+(-1)^k*C_k^k)]|\)
    • 我才发现,居然组合数,\(C_k^0 - C_k^1 + ... +(-1)^i*C_k^i+...+(-1)^k*C_k^k\)一正一负这样相加,只有在k=0的时候,为1,其他都是为0的!
    • 在这个题目中,\(n-i==0\) 的时候\(a_i\)才能保留住,其他\(a_i\)都为0了,即\(i==n\)的才能保留下来,所以最后的答案为\(a_n\), 即A数组里面最大那个数。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T,n;
	scanf("%d",&T);
	while(T--){
		int ans=0; 
		scanf("%d",&n);
		int x;
		for(int i=1;i<=n;i++){
			scanf("%d",&x);
			ans=ans<x?x:ans;
		}
		printf("%d\n",ans);
	}
}