怎么说呢?

因为是在mod 2 意义下的吗(一般是遇到二就可能是位运行算或二分图)

就可以利用异或计算。

因为奇数和偶数在二进制上就用判断最后一位就可以了

然后因为异或符合交换律和结合律

直接消元就可以辣

不过对于这个题,输出第一个数字可能是对与我这种蒟蒻的一个挑战。所以,我会在代码中详细的注释

bitset

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<bitset>
using namespace std;
char in[52000];
bitset<2010>map[2010];//黑科技
int n,m;
int ans[2010];//记录答案
bool gauss(int &res)//此处为引用
{
for(int i=1;i<=n;i++)
{
int r=i;
while(!map[r][i]&&r<m+1)
r+=1;
if(r==m+1)
return false;
else
res=max(res,r);//从第一个条件一个一个往下找,直到找到一个第i项系数不为零
if(i!=r)
swap(map[i],map[r]);//提上来
for(int j=i+1;j<=m;j++)//注意:这里是把所有条件的第i项全消了
if(map[j][i])
map[j]^=map[i];//bitset支持一行与另一行异或
}
ans[n]=map[n][n+1];//往回带
for(int i=n-1;i>=1;i--)
{
ans[i]=map[i][n+1];
for(int j=i+1;j<=n;j++)
ans[i]^=(ans[j])*(map[i][j]);//注意系数
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%s",in+1);
//printf("%s",in+1);
for(int j=1;j<=n;j++)
map[i][j]=in[j]-'0';//bitset可以直接赋值
int t;
scanf("%d",&t);
map[i][n+1]=t;
}
int judge=0;//judge是判断到第几个条件就可以求出所有解
if(!gauss(judge))
printf("Cannot Determine");
else
{
printf("%d\n",judge);
for(int i=1;i<=n;i++)
{
switch(ans[i])
{
case 1:printf("?y7M#\n");break;
case 0:printf("Earth\n");break;
}
}
}
}

最新文章

  1. rabbitmq
  2. js三级地区联动
  3. PHP基础教程-54课-问题
  4. 点击document隐藏某个div
  5. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
  6. (Beta)Let&#39;s-版本发布说明
  7. Spring mvc get和post传值乱码问题
  8. SecureCRT7.3和SecureFX7.3的MAC下破解
  9. Android Studio开发遇到程序崩溃问题
  10. .net很简介的操作json数组
  11. SQL SERVER 表最小行的一个纠结问题
  12. Linq 生成运算符 Empty,Range,Repeat
  13. tomcat知识(一)
  14. Linux 学习 (四) 帮助命令
  15. mysql读写分离——中间件ProxySQL的简介与配置
  16. 最简单的struts应用
  17. jQuery使用(六):DOM操作之元素包裹、克隆DOM与data的综合应用
  18. Oracle 11.2.0.4 For Windows 64bit+32bit 数据库
  19. 数据加密之DES加密
  20. JAVA反射机制_获取字节码文件对象

热门文章

  1. spring中注解注入 context:component-scan 的使用说明
  2. java替换word表格2007
  3. mysql忘记密码时,重新修改密码
  4. 那些经历过的Bug Unity的Invoke方法
  5. 021-动态生成验证码jsp代码模板
  6. MahApps.Metro控件更換微軟視窗主題
  7. Tips In C
  8. Makefile2
  9. 前端如何做好SEO优化
  10. js获取日期:前天、昨天、今天、明天、后天