Unusual Product
题意:给出一个n行n列的矩阵,有3中操作:
1 i 表示把第i行全部取反;
2 i表示把第i列全部取反;
3 输出这个矩阵乘以自身的乘积。
分析:因为这里的矩阵相乘是第一行乘以第一列,第二行乘以第二列……所以只有a[i][i] 乘了自己一次,其他都是互相乘了两次,既然乘了两次,那么只有两种情况,一种是(0*1 + 1*0)%2=0,另 一种是(1*1+1*1)%2=0,这两种模2后都等于0,所以这些都不需要算了……既然是模2,那么直接用 异或 来算都可以了……当把每行或者每列的每个值都由0变1或者由1变0后,那么主对角线的肯定有一个值变了,所以结果值再异或1即可。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int a[1005][1005];
int n;
int get_ans()
{
int ans = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
ans ^= a[i][j] * a[j][i];
return ans;
}
int main()
{
int i, j, q, t, k;
while(~scanf("%d",&n))
{
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
scanf("%d",&a[i][j]);
int ans = get_ans();
scanf("%d",&q);
while(q--)
{
scanf("%d",&k);
if(k == 3)
printf("%d",ans);
else
{
scanf("%d",&t);
ans ^= 1;
}
}
printf("\n");
}
return 0;
}