如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1042

来自"NOCOW"

跳转到: 导航, 搜索

Solution From Xcheng:

这题初看很像 补丁与错误,于是想宽搜。看了数据,2^250,绝对爆MT。

其实这是一个同余方程。(模=2)

即以下的形式

x1*a11+x2*a21+x3*a31......+xn*an1=1

x1*a12+x2*a22+x3*a32......+xn*an2=1

x1*a13+x2*a23+x3*a33......+xn*an3=1

.

.

.

x1*a1n+x2*a2n+x3*a3n......+xn*ann=1


其中 ai,j 表第J个暖气阀第I个工人能否操作。

解这样的方程(模都为2)只要用高斯消元直接做就可以了,每次操作后MOD 2。


http://www.cgang.tk by cgangee

const maxn=250;
 
var i,j,k,m,n,l:longint;
    a:array[0..maxn,0..maxn]of longint;
    f,g:array[1..maxn]of longint;
    ans:array[1..maxn]of boolean;
 
begin
     readln(n);
     for i:=1 to n do
     begin
          read(j);
          while j<>-1 do
          begin
               a[i,j]:=1;
               read(j);
          end;
          a[0,i]:=1;
     end;
 
     for i:=1 to n do
     begin
          for j:=1 to i-1 do
          begin
               if a[g[j],i]=0 then continue;
               for k:=0 to n do a[k,i]:=a[k,i] xor a[k,j];
          end;
          for j:=1 to n do if a[j,i]<>0 then break;
          if a[j,i]=0 then begin writeln('No answer'); halt; end;
          g[i]:=j;
     end;
 
     for i:=n downto 1 do
     begin
          for j:=1 to g[i]-1 do a[0,i]:=a[0,i] xor f[j]*a[j,i];
          for j:=g[i]+1 to n do a[0,i]:=a[0,i] xor f[j]*a[j,i];
          f[g[i]]:=a[0,i];
     end;
     for i:=1 to n do if f[i]=1 then write(i,' ');
end.


by zhujf553

//异或方程组 
#include <iostream>
#include <stdlib.h>
 
using namespace std;
 
const int maxn = 251;
 
int n;
int a[maxn][maxn], g[maxn];
 
void init()
{
	int x;
	cin >> n;
	for(int i = 1 ; i <= n ; i++)
	{
		cin >> x;
		while(x != -1)
		{
			a[x][i] = 1;
			cin >> x;
		}
		a[i][0] = 1;
	}
}
 
void work()
{
	int i, j, k, c;
	for(i = 1 ; i <= n ; i++)
	{
		for(c = i ; c <= n ; c++)if(a[c][i]) break;
		for(k = 0 ; k <= n ; k++) swap(a[i][k], a[c][k]);
		for(j = i + 1 ; j <= n ; j++)
		if(a[j][i])
		{
			a[j][0] ^= a[i][0];
			for(k = i ; k <= n ; k++)
				a[j][k] ^= a[i][k];
		}
	}
	for(i = n ; i >= 1 ; i--)
	{
		int t = 0;
		for(j = i + 1 ; j <= n ; j++)
			t ^= g[j] & a[i][j];
		g[i] = a[i][0] ^ t;
	}
	for(i = 1 ; i <= n ; i++)
	if(g[i])
		cout << i << ' ';
}
 
int main()
{
	init();
	work();
	return 0;
}
个人工具