bzoj 3105: [cqoi2013]新Nim游戏 (高斯消元求解线性基)

3105: [cqoi2013]新Nim游戏

Time Limit: 10 Sec   Memory Limit: 128 MB
Submit: 986   Solved: 582
[ Submit][ Status][ Discuss]

Description

传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同)。两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿。拿走最后一根火柴的游戏者胜利。
本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一样,第二个游戏者也有这样一次机会。从第三个回合(又轮到第一个游戏者)开始,规则和Nim游戏一样。
如果你先拿,怎样才能保证获胜?如果可以获胜的话,还要让第一回合拿的火柴总数尽量小。
 

Input

第一行为整数k。即火柴堆数。第二行包含k个不超过109的正整数,即各堆的火柴个数。
 

Output

 
输出第一回合拿的火柴数目的最小值。如果不能保证取胜,输出-1。

Sample Input

6
5 5 6 6 5 5

Sample Output

21

HINT

k<=100

Source

[ Submit][ Status][ Discuss]

题解:高斯消元求解线性基

线性相关:

有向量组A: a1a2, ···, am,

如果存在不全为零的数 k1, k2, ···,km , 使k1*a1+ k2*a2+ ··· + km*am0

则称向量组A是线性相关的, 否则称它是线性无关.

线性相关的基是满足线性无关的极大子集。

根据题意,如果先手能够获胜,那么必然存在某种方案使先手操作后的序列变成一个线性无关组,即无论后手怎么选取都不可能出现异或和为0的方案。

这个线性无关组其实就是一组线性基,这个怎么理解呢?虽然线性基中的数不一定能对应回原来的堆数,但是一定可以对映回原操作数的一种合法变动方案后的结果。

然后我们可以排序,然后用贪心的思路求解带权线性无关组问题。

#include
#include
#include
#include
#include
#define N 103
#define LL long long
using namespace std;
int n,m,b[N],a[N],tot,zero,vis[N];
struct data{
	int x,num;
}a1[N];
int gauss()
{
	tot=zero=0;
	for (int i=b[30];i;i>>=1){
		int j=tot+1;
		while (!(i&a[j])&&j<=n) j++;
		if (j==n+1) continue;
		tot++;
		swap(a[j],a[tot]);
		for (int k=1;k<=n;k++)
		 if (k!=tot&&(a[k]&i)) a[k]^=a[tot];
	} 
	return tot;
}
int cmp(data a,data b)
{
	return a.x>b.x;
}
int main()
{
	freopen("a.in","r",stdin);
	freopen("my.out","w",stdout);
	scanf("%d",&n);
	b[0]=1;
	for (int i=1;i<=30;i++) b[i]=b[i-1]*2;
	LL size=0;
	for (int i=1;i<=n;i++) scanf("%d",&a[i]),size+=(LL)a[i];
	for (int i=1;i<=n;i++) 
	 a1[i].x=a1[i].num=a[i];
	sort(a1+1,a1+n+1,cmp);
	int t=gauss();
	if (!t) {
		printf("-1\n");
		return 0;
	}
	LL ans=0;
	memset(vis,0,sizeof(vis));
	for (int i=1;i<=n;i++) {
		for (int j=30;j>=0;j--) {
			if ((a1[i].num>>j)&1){
				if (!vis[j]) {
					vis[j]=a1[i].num;
					break;
				}
				a1[i].num^=vis[j];
			}
		}
		if (a1[i].num) ans+=(LL)a1[i].x;
	}
	printf("%I64d\n",size-ans);
}



你可能感兴趣的:(高斯消元)