CF869A The Artful Expedient 结论题+数论

版权声明:本文为DyingShu原创文章,转载请注明出处哦。 https://blog.csdn.net/DyingShu/article/details/82825130

传送门

题目描述
Tommy和Karen在玩一个游戏。
他们各自准备了一个长度为n的数组,Tommy的数组称作a,Karen的数组称作b。
保证这2n个数互不相同,设这2n个数构成的集合为S。
现在他们想知道,有多少对(i,j)满足a[i] xor b[j]的结果在集合S中。
当这个数为奇数的时候,Tommy获胜,否则Karen获胜。
现在给你n和这两个数组,你需要告诉他们是谁赢了。
输入
第一行一个整数T,表示数据组数。
每组数据内,第一行一个正整数n。
每组数据内,第二行n个正整数,表示数组a。
每组数据内,第三行n个正整数,表示数组b。
输出
输出T行,每行一个字符串Tommy或者Karen,表示谁胜利了。

唉,就是道结论题,害我想了一个小时
a , b a,b 里的数都大于1时,若存在 a [ i ]   x o r   b [ j ] S a[i]\ xor\ b[j] \in S

  • a [ i ]   x o r   b [ j ] = = a [ k ] a[i]\ xor\ b[j] == a[k] 时,有 a [ k ]   x o r   b [ j ] = = a [ i ] a[k]\ xor\ b[j] == a[i]
  • a [ i ]   x o r   b [ j ] = = b [ k ] a[i]\ xor\ b[j] == b[k] 时,有 a [ i ]   x o r   b [ k ] = = b [ j ] a[i]\ xor\ b[k] == b[j]

所以答案只能是偶数,即Karen获胜。
怪不得看几个样例全是Karen胜。。。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 200001;

int Ans;
int a[MAXN], b[MAXN];

inline int read(){
    int k = 0, f = 1; char ch = getchar();
    while(ch < '0' || ch > '9'){if(ch == '-') f = -1; ch = getchar();}
    while(ch >= '0' && ch <= '9'){k = k*10 + ch - '0'; ch = getchar();}
    return k * f;
}

int main(){
    int n = read(), Ans = 0;
    for(int i = 1; i <= n; i++){
        a[i] = read();
    }
    for(int i = 1; i <= n; i++){
        b[i] = read();
    }
    puts("Karen");
    return 0;
}

总结:要勤于打表

猜你喜欢

转载自blog.csdn.net/DyingShu/article/details/82825130