#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/43482357"); }
题意:中文题。
题解:
呃,求自由元个数,然后输出1<<ans;(自由元就是高斯消元消某个变量x时发现以下所有方程当前此位系数都是0)
如果无解输出那个题中给的串。
诶网上代码真不可看,我绝望了决定照自己想法随便写写。
然后49行没压行搞过去了。
网上全是100行+什么心态。
然后还复杂难看。
代码:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 40 #define inf 0x3f3f3f3f using namespace std; bool a[N][N],ans[N]; int Gauss(int n,int m) { int i,j,k,ret=0,id; for(id=i=1;i<n;i++,id++) { for(j=id;j<=m&&!a[j][i];j++); if(j>m){id--,ret++;continue;} if(id!=j)for(k=i;k<=n;k++)swap(a[id][k],a[j][k]); for(j=id+1;j<=m;j++)if(a[j][i])for(k=i;k<=n;k++) a[j][k]^=a[id][k]; } for(i=id;i<=m;i++)if(a[i][n])return -1; return ret; } int n; int main() { // freopen("test.in","r",stdin); int i,j,k,g; int x,y; for(scanf("%d",&g);g--;) { memset(a,0,sizeof a); scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&a[i][n+1]); for(i=1;i<=n;i++)scanf("%d",&k),a[i][n+1]^=k; for(i=1;i<=n;i++)a[i][i]=1; while(scanf("%d%d",&x,&y),x+y)a[y][x]=1; x=Gauss(n+1,n); if(x==-1)puts("Oh,it's impossible~!!"); else printf("%d\n",1<<x); } return 0; }