题目描述
你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的精神,你想购买更少的颜料就满足要求,所以兼职程序员的你需要编程来计算出最少需要购买几种颜色的颜料?
输入描述
第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50) 第二行为n个数xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各种颜料.
输出描述
输出最少需要在商店购买的颜料颜色种数,注意可能购买的颜色不一定会使用在画中,只是为了产生新的颜色。
示例1
输入
3
1 7 3
输出
3
分析
因为涉及到异或操作,所以我们要把每个数字作为二进制处理,我们要用最少的颜料混合出所有想要的颜料,又因为每个颜料的二进制可以看作一个向量,等同于求向量组的基。求向量的基可以用我们在线性代数中学到的高斯消元法,最终结果呈上三角矩阵。
def getNum(num): ans = 0 while num: num = num / 2 ans += 1 return ans def getRank(x,n): for i in range(n-1): x[i:] = sorted(x[i:],reverse=True) g = getNum(x[i]) for j in range(i+1,n): d = getNum(x[j]) if d == g: x[j] = x[j]^x[i] res = 0 for i in x: if i != 0: res += 1 return res n = int(raw_input().strip()) x = map(int,raw_input().strip().split()) print(getRank(x,n))