数学专项matrix:LA 2561
2013-08-05 23:46
471 查看
显然可以以30个按钮是否按下为变量列出30个在模2剩余系下的方程,然后进行高斯消元即可,因为是在模2剩余下,所以加减操作都可以通过异或来完成。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; typedef int matrix[35][35]; int dx[]={1,-1,0,0},dy[]={0,0,1,-1}; matrix A; void gauss() { int i=0,j=0,k,r,u; while(i<30 && j<30) { r=i; for(k=i;k<30;k++) if(A[k][j]) {r=k;break;} if(A[r][j]) { if(r!=i) for(k=0;k<=30;k++) swap(A[r][k],A[i][k]); for(u=i+1;u<30;u++) if(A[u][j]) for(k=i;k<=30;k++) A[u][k]^=A[i][k]; i++; } j++; } for(i=29;i>=0;i--) for(j=i+1;j<30;j++) A[i][30]^=A[j][30]*A[i][j]; } int main() { int T,kase=1; scanf("%d",&T); while(T--) { memset(A,0,sizeof(A)); for(int i=0;i<5;i++) for(int j=0;j<6;j++) scanf("%d",&A[i*6+j][30]); for(int i=0;i<5;i++) for(int j=0;j<6;j++) { A[i*6+j][i*6+j]++; for(int k=0;k<4;k++) { int x=i+dx[k],y=j+dy[k]; if(x>=0 && x<5 && y>=0 && y<6) A[x*6+y][i*6+j]++; } } gauss(); printf("PUZZLE #%d\n",kase++); for(int i=0;i<5;i++) for(int j=0;j<6;j++) if(j==5) printf("%d\n",A[i*6+j][30]); else printf("%d ",A[i*6+j][30]); } return 0; }
相关文章推荐
- 数学专项counting:LA 3295
- 数学专项counting:LA 5846
- 数学专项number_theory:LA 4079
- 数学专项number_theory:LA 4382
- 数学专项counting:LA 3357
- 数学专项matrix:UVa 10689
- 数学专项number_theory:LA 2955
- 数学专项matrix:UVa 11551
- 数学专项counting:LA 4064
- 数学专项matrix:UVa 11149
- 数学专项number_theory:LA 3262
- 数学专项counting:LA 3720
- 数学专项number_theory:UVa 718
- 【考虑周全+数学变形】【11月赛】Is it a fantastic matrix?
- UVALive 3490 (LA 3940) || ZOJ 2619 Generator AC自动机(或KMP) + 整数高斯消元 + 数学期望
- 杂题专项:LA 3602
- 数学专项counting:UVa 10079
- 字符串专项:LA 4126
- Laplacian Matrix
- [ACM_模拟][ACM_数学] LA 2995 Image Is Everything [由6个视图计算立方体最大体积]