题目链接:
https://codeforces.com/problemset/problem/1151/B
题目大意:
给你一个n*m的矩阵,每一行你可以选一个数,在每一行都选数的前提下,问你能不能能使每一行选的这些数的异或值不是0,如果存在的话,输出这些下标。
具体思路:
首先我们把第一列异或起来,判断这一列的异或起来的值是不是0,如果不是0的话,直接输出;否则对于每一行,找到一个不和这一行第一个不相等的数,找到就立即停。如果找不到就是凑不出来。
具体证明:
如果每一行找不到的话,就说明每一行的数是相同的,也就是无论你怎么选,结果都是相同的。得证
这题思路属实nb
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 const int maxn = 550; 5 const ll mod = 1e9+7; 6 int a[maxn][maxn]; 7 int main() 8 { 9 int n,m; 10 scanf("%d %d",&n,&m); 11 for(int i=1; i<=n; i++) 12 { 13 for(int j=1; j<=m; j++) 14 { 15 scanf("%d",&a[i][j]); 16 } 17 } 18 int flag=1; 19 int ans=0; 20 for(int i=1; i<=n; i++) 21 { 22 ans^=a[i][1]; 23 } 24 if(ans) 25 { 26 printf("TAK "); 27 for(int i=1; i<=n; i++) 28 { 29 printf("1 "); 30 } 31 printf(" "); 32 } 33 else 34 { 35 int pos=-1; 36 int tmp=0; 37 for(int i=1; i<=n; i++) 38 { 39 int k=0; 40 for(int j=2; j<=m; j++) 41 { 42 if(a[i][j]!=a[i][1]) 43 { 44 pos=i; 45 tmp=j; 46 k=1; 47 break; 48 } 49 } 50 if(k) 51 break; 52 } 53 if(pos==-1) 54 { 55 printf("NIE "); 56 } 57 else 58 { 59 printf("TAK "); 60 for(int i=1; i<=n; i++) 61 { 62 if(i==pos) 63 printf("%d ",tmp); 64 else 65 printf("1 "); 66 } 67 printf(" "); 68 } 69 70 } 71 return 0; 72 }