Unusual Product(codeforces)

来源:互联网 发布:真人绘画软件 编辑:程序博客网 时间:2024/05/17 07:08



  题目大意是将一个矩阵进行某一行(列)求每个元素的逆,

输出是将第i行与第i列的对应元素相乘,然后相加,最后将所以行列求得的所以数相加求和,%2后输出。

  1 n 代表将第n行的元素求逆

  2 n 代表将第n列的元素求逆

  3   代表输出结果

 解题思路:

单纯模拟是由于操作的次数过多,每次操作最少要达到    ON3),操作次数最多要达到10的六次方,最后可定会超时。

我们仔细分析后可以发现,其实对一个矩阵来说,影响其输出的只有主对角线上的元素,其他元素与其对应元素的乘积必定会出现两次。所以我们只要关注对角线元素就行。

我们要是再仔细分析下就会发现,其实每一次行列操作只会改变一个主对角线上的值,所以每操作一次结果就要改变一次,又由于结果只能是01。也就是所每次操作过后,将原有结果求逆就行了。

我的代码:

#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;

}

0 0
原创粉丝点击