bzoj3811 玛里苟斯 高斯消元&dfs

这道题目还要根据k来分类讨论。。。。

当k=1的时候,按位求贡献,然后发现答案就是所有数or起来再/2。

当k=2的时候,就真的要按位来了。。按照(x1+x2+...+xn)^2展开x1x1+x1x2+x1x3...+xnxn,枚举i,j表示后面式子的下标。然后一个数就变成(0/1,0/1)二元组,当选出的数二元组异或后为(1,1)的时候有2^(i+j)的贡献。显然根据k=1发现(1,1)概率应该是1/4,但特殊情况就是所有二元组都是(0,0)或者(1,1)的形式则概率为1/2。

当k>2的时候,显然每个数<=2^21,而如果一个数能通过别的数异或得到则没有用。维护一个线性基然后就只有22个数了,dfs即可。

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005
#define M 75
#define ll unsigned long long
using namespace std;

int n,flag; ll ans,res,mod,bin[M],a[N],base[M]; bool f[M][M];
void calc(){
	int i,j;
	for (i=1; i<=n; i++)
		for (j=31; j>=0; j--) if (a[i]&bin[j])
			if (!base[j]){
				base[j]=a[i]; break;
			} else a[i]^=base[j];
	for (j=n=0; j<32; j++) if (base[j]) a[++n]=base[j];
}
void solve1(){
	int i,j,k,t;
	for (i=0; i<32; i++)
		for (j=1; j<=n; j++) f[i][j]=(a[j]&bin[i])?1:0;
	for (i=0; i<32; i++)
		for (j=0; j<32; j++){
			for (k=1; k<=n; k++) if (f[i][k]) break;
			if (k>n) continue;
			for (k=1; k<=n; k++) if (f[j][k]) break;
			if (k>n) continue;
			t=0;
			for (k=1; k<=n && !t; k++)
				if (f[i][k]!=f[j][k]) t=1;
			if (i+j-1-t<0) res++; else ans+=bin[i+j-1-t];
			ans+=res>>1; res&=1;
		}
	printf("%llu",ans); puts(res?".5":"");
}
void dfs(int k,ll now){
	if (k>n){
		int i; ll u=0,v=1;
		for (i=1; i<=flag; i++){
			u*=now; v*=now;
			u+=v>>n; v&=mod;
		}
		ans+=u; res+=v;
		ans+=res>>n; res&=mod;
		return;
	}
	dfs(k+1,now); dfs(k+1,now^a[k]);
}
void solve2(){
	mod=bin[n]-1; dfs(1,0);
	printf("%llu",ans); puts(res?".5":"");
}
int main(){
	scanf("%d%d",&n,&flag); int i;
	bin[0]=1; for (i=1; i<63; i++) bin[i]=bin[i-1]<<1;
	for (i=1; i<=n; i++) scanf("%llu",&a[i]);
	if (flag==1){
		for (i=1; i<=n; i++) ans|=a[i];
		printf("%llu",ans>>1); puts((ans&1)?".5":"");
		return 0;
	}
	calc();
	if (flag==2) solve1(); else solve2();
	return 0;
}

by lych

2016.5.9

时间: 2024-10-11 17:04:18

bzoj3811 玛里苟斯 高斯消元&dfs的相关文章

POJ1288 Sly Number(高斯消元 dfs枚举)

由于解集只为{0, 1, 2}故消元后需dfs枚举求解 #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<vector> #include<cmath

BZOJ2115 WC2011 Xor DFS+高斯消元

题意:给定一张无向图,求1到N异或和最大的路径,允许重复经过. 题解:首先跑出1到N的一条路径,答案就是在这条路径上不断加环.首先用DFS处理出所有基环的异或和(其他环一定由基环构成,重复部分异或之后就会消掉),然后就是从一堆数里选任意个数使得异或和最小了,怎么做可以去看莫涛的课件(同解01异或方程),这里我简单介绍一下. 通过高斯消元,我们对原来的数进行操作,使得所有原来的数都可以用操作之后的数来组合而成(这玩意貌似叫线性基啊).具体做法就是从高到低暴力枚举每一位i,找到一个第i位为1的数j,

BZOJ 2115 Wc2011 Xor DFS+高斯消元

题目大意:给定一个无向图,每条边上有边权,求一条1到n的路径,使路径上权值异或和最大 首先一条路径的异或和可以化为一条1到n的简单路径和一些简单环的异或和 我们首先DFS求出任意一条1到n的简单路径以及图中所有最简单的简单环(环上不存在两个点可以通过环外边直连) 然后在一些数中选出一个子集,使它们与一个给定的数的异或和最大,这就是高斯消元的问题了 利用高斯消元使每一位只存在于最多一个数上 然后贪心求解即可 #include<cstdio> #include<cstring> #in

【BZOJ2322】[BeiJing2011]梦想封印 高斯消元求线性基+DFS+set

[BZOJ2322][BeiJing2011]梦想封印 Description 渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解. 为了分析一种奇特的称为梦想封印(Fantasy Seal)的特技,需要引入如下的概念: 每一位魔法的使用者都有一个“魔法脉络”,它决定了可以使用的魔法的种类. 一般地,一个“魔法脉络”可以看作一个无向图,有N个结点及M条边,将结点编号为1~N,其中有一个结点是特殊的,称为核心(Kernel),记作1号结点.每一条边有一个固有(即生成之后再也不

【BZOJ2466】【中山市选2009】树 高斯消元解异或方程组

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44356273"); } 题解: 参照此题解,也是我写的,俩题一样. [POJ1681]Painter's Problem 高斯消元,求最小∑系数的异或方程组 代码: #include <cmath> #include &

线代之高斯消元

数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解.但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵.不过,如果有过百万条等式时,这个算法会十分省时.一些极大的方程组通常会用迭代法以及花式消元来解决.当用于一个矩阵时,高斯消元法会产生出一个"行梯阵式".高斯消元法可以用在电脑中来解决数千条等式及未知数.亦有一些方法特地用来解决一些有特别排列的系数的方程组. 2968: Lights  Time Limit(Common

bzoj 2707 [SDOI2012]走迷宫(SCC+高斯消元)

Description Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的有向边,到达另一个点.这样,Morenan走的步数可能很长,也可能是无限,更可能到不了终点.若到不了终点,则步数视为无穷大.但你必须想方设法求出Morenan所走步数的期望值. Input 第1行4个整数,N,M,S,T 第[2, M+1]行每行两个整数o1, o2,表示有一条从o

BZOJ 2466: [中山市选2009]树( 高斯消元 )

高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<bitset> using namespace std; const int ma

2015南阳CCPC E - Ba Gua Zhen 高斯消元 xor最大

Ba Gua Zhen Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description During the Three-Kingdom period, there was a general named Xun Lu who belonged to Kingdom Wu. Once his troop were chasing Bei Liu, he was stuck in the Ba Gua Zhen from Liang Zhuge.