3364 Lanterns (异或方程组高斯消元)
2024-08-26 08:20:19
基本思路。首先构造一个n*(m+1)的矩阵,同时标记一个行数row,row从零开始,然后找出每一列第一个非零的数,和第row行互换,
然后对row到n行,异或运算。最终的结果为2^(m-row)
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int array[55][55],n,m,h[55][55]; int main() { int i,j,k,t,a,q; scanf("%d",&t); for(int v=1;v<=t;v++) { memset(array,0,sizeof(array)); memset(h,0,sizeof(h)); scanf("%d%d",&n,&m); for(i=0;i<m;i++) { scanf("%d",&k); while(k--) { scanf("%d",&a); array[a-1][i]=1; } } for(i=0;i<n;i++) for(j=0;j<m;j++) h[i][j]=array[i][j]; printf("Case %d:\n",v); scanf("%d",&q); while(q--) { for(i=0;i<n;i++) for(j=0;j<m;j++) array[i][j]=h[i][j]; for(i=0;i<n;i++) scanf("%d",&array[i][m]); /*for(i=0;i<n;i++) { for(j=0;j<=m;j++) printf("%d ",array[i][j]); printf("\n"); }*/ __int64 ans=1; int row=0; for(i=0;i<m;i++) { for(j=row;j<n;j++) if(array[j][i]) break; if(j==n)continue; if(j!=row) { for(k=0;k<=m;k++) swap(array[row][k],array[j][k]); } for(j=row+1;j<n;j++) { if(array[j][i]) { for(k=0;k<=m;k++) array[j][k]^=array[row][k]; } } row++;//这里不用担心row超过n,因为从n行开始,每行的数字都是0 } for(j=row;j<n;j++) if(array[j][m]) { ans=0; break; } int tmp=m-row; while(tmp--) ans*=2; printf("%I64d\n",ans); } } return 0; }
最新文章
- 如何提升我的HTML&;CSS技术,编写有结构的代码
- VIJOS P1037搭建双塔[DP]
- Linux vmstat命令实战详解
- BZOJ 1013 &; 高斯消元
- CentOS安装视频播放器SMPlayer
- 【USACO 2.4.1】两只塔姆沃斯牛
- 正则如何匹配div下的所有<;li>;标签?
- WCF学习心得----(三)服务承载
- sudo命令出错 must set be suid
- easyui datebox定位到某一个日期, easyui datebox直接定位到具体的日期, easyui datebox MoveTo方法使用
- Linux(二)CentOS的安装
- 如果在ie上报错又找不到问题原因该怎么办?
- python 读取指定div的内容
- Linux中通过Socket文件描述符寻找连接状态介绍
- ELK+SpringBoot+Logback离线安装及配置
- 函数和常用模块【day06】:shelve模块(五)
- 如何搭一个vue项目
- Linux IP和网关配置
- 《PHP, MySQL, Javascript和CSS》读书随手记----php篇
- 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)