http://codeforces.com/problemset/problem/405/C
题意:
给出一个n*n的矩阵,有q个操作,输入3时,输出A ,A等于第i行乘以第i列的对应元素的和(mod2),输入1 x,表示将第x行的元素翻转(即0变成1,1变成0),输入2 x,表示将第x列的元素翻转.
思路:
根据A的计算方式可知A的最终结果只由左对角线上的元素将决定,如果左对角线上的元素为1的个数有奇数个(可通过异或计算),则A=1,否则A=0。翻转的时候每翻转一行或一列,都会改变对角线的元素,故结果应异或上1.
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <stdio.h> 2 #include <string.h> 3 const int N=1002; 4 int a[N][N]; 5 6 int main() 7 { 8 int n; 9 scanf("%d",&n); 10 int A = 0; 11 for (int i = 1; i <= n; i++) 12 { 13 for (int j = 1; j <= n; j++) 14 { 15 scanf("%d",&a[i][j]); 16 if (i==j) A^=a[i][j]; 17 } 18 } 19 int q,x; 20 scanf("%d",&q); 21 while(q--) 22 { 23 scanf("%d",&x); 24 if (x==3) 25 printf("%d",A); 26 else 27 { 28 scanf("%d",&x); 29 A^=1; 30 } 31 } 32 return 0; 33 }