对于 20%的数据,满足 N=M≤20;
对于 40%的数据,满足 N=M≤500;
对于 70%的数据,满足 N≤500,M≤1,000;
对于 100%的数据,满足 N≤1,000,M≤2,000。
==========================================================
请不要提交!
第一轮Day1
题解:高斯消元解异或方程。
因为这道题告诉的是mod 2 后的值,所以肯定就不能用简单的线性方程来求解了。因为异或(XOR)运算由于与“奇偶性”密切相关,所以这里用的是异或方程 。形如:
a11*x1 XOR a12*x2 XOR ... XOR a1n*xn = b1
设置一个变量p,一开始p=1,然后,i从1到n,每次执行:若在第p个及以后的方程中,至少有一个方程的xi系数为1,设为第q个方程,则先将第p、q个方程交换,然后用第p个方程去XOR后面剩下的所有xi系数为1的方程(各系数包括b都对应进行XOR运算,实际上就是矩阵初等行变换),将它们的xi系数均变成0,最后p加1;
<span style="font-size:18px;">#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<bitset> using namespace std; int n,m,ans; typedef bitset<1005> M[2005]; M a; void gauss() { int now=0; for(int i=1;i<=n;i++)//一共需要n个方程,第I个方程表示第I个千足虫的答案 { int j=now+1; while (!a[j][i]&&j<=m) j++;//要用第I个方程表示第I个千足虫,所以a[j][i]即第I个千足虫的系数不能为0 if (j==m+1)//now<n,不能形成三角矩阵,存在n-now个自由元,所以有多组解 { ans=-1; return; } else ans=max(ans,j);//为了寻找第I个千足虫系数不为零的方程,会向下寻找 now++; swap(a[now],a[j]); for (int k=1;k<=m;k++) if (k!=now&&a[k][i]) a[k]^=a[now];//这里bitset用的很巧妙,因为每一位都需要异或,所以直接整体异或一下就好了,用高斯消元来解异或方程。 } } int main() { freopen("a.in","r",stdin); scanf("%d%d\n",&n,&m); for (int i=1;i<=m;i++) { char s[1003]; scanf("%s",s+1); for (int j=1;j<=n;j++) a[i][j]=s[j]-'0'; int t; scanf("%d",&t); a[i][n+1]=t; } gauss(); if (ans==-1) { printf("Cannot Determine\n"); return 0; } printf("%d\n",ans); for (int i=1;i<=n;i++) if (a[i][n+1]==0) printf("Earth\n"); else printf("?y7M#\n"); }</span>