题目大意是将一个矩阵进行某一行(列)求每个元素的逆,
输出是将第i行与第i列的对应元素相乘,然后相加,最后将所以行列求得的所以数相加求和,%2后输出。
1 n 代表将第n行的元素求逆
2 n 代表将第n列的元素求逆
3 代表输出结果
解题思路:
单纯模拟是由于操作的次数过多,每次操作最少要达到 O(N3),操作次数最多要达到10的六次方,最后可定会超时。
我们仔细分析后可以发现,其实对一个矩阵来说,影响其输出的只有主对角线上的元素,其他元素与其对应元素的乘积必定会出现两次。所以我们只要关注对角线元素就行。
我们要是再仔细分析下就会发现,其实每一次行列操作只会改变一个主对角线上的值,所以每操作一次结果就要改变一次,又由于结果只能是0和1。也就是所每次操作过后,将原有结果求逆就行了。
我的代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int n,s,a;
int main (){
while (scanf("%d",&n)!=EOF){
s=0;
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
scanf("%d",&a);
if (i==j) s+=a;
}
}s%=2;
int k;scanf("%d",&k);
for (int i=0;i<k;i++){
int q,m;scanf("%d",&q);
if (q==1||q==2) {scanf("%d",&m);s=!s;}
if (q==3) printf("%d",s);
}
printf("\n");
}
return 0;
}