输入描述:
第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50)
第二行为n个数xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各种颜料.
输出描述:
输出最少需要在商店购买的颜料颜色种数,注意可能购买的颜色不一定会使用在画中,只是为了产生新的颜色。
输入例子:
3
1 7 3
输出例子:3
#include<iostream>
#include<algorithm>
using namespace std;
const int bitnum=8*sizeof(int);
const int N=50;
int a[N];
int bitarray[N][bitnum];
int n;
void getbit()
{
for(int i=0;i<n;i++)
{
int temp=a[i];
int flag=1;
for(int j=0;j<bitnum;j++)
{
if(temp&flag)
bitarray[i][bitnum-j-1]=1;
else
bitarray[i][bitnum-j-1]=0;
flag=flag<<1;
}
}
}
int getvalue()
{
getbit();
int result=0,col=0,row=0;
//高斯消元过程
for(;col<bitnum;col++,result++)
{
for(row=result;row<n;row++)//result之前的行是已经消元过的行,满足bitarray[result][col]=1,这个循环是找到col列中第一个不为1的行
{
if(bitarray[row][col])
break;
}
if(row==n)//表明没有找到,因为循环有一个result++,所以这有个result--
result--;
else
{
swap(bitarray[row],bitarray[result]);//交换找到的行和result行
for(int i=row+1;i<n;i++)//从row+1行开始查找,找不为1的行
{
if(bitarray[i][col])//相当于第i行元素减去第result行
{
for(int j=col;j<bitnum;j++)
bitarray[i][j]^=bitarray[result][j];
}
}
}
}
return result;
}
int main()
{
while(scanf("%d",&n)>0)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int ans=getvalue();
cout<<ans<<endl;
}
return 0;
}