如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。
URAL/1042
来自"NOCOW"
< URAL
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; }