Codeforces Round #334 E. Lieges of Legendre(SG)

来源:互联网 发布:it船舶 编辑:程序博客网 时间:2024/06/13 21:18

题意:现在两个人玩游戏,有n堆木棒,每次可以进行两种操作,第一种是将奇数堆的木棒数减一,第二种是将偶数堆的木棒数分为k组,每组的数量为原堆的一半,先不能移动的人输,问谁会赢。

思路:SG。对k分奇偶来求sg函数即可。

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<ctime>#define eps 1e-6#define LL long long#define pii pair<int, int>//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const int MAXN = 110000;//const int INF = 0x3f3f3f3f;int n, a[MAXN];int get_sg1(int m) {if(m==1 || m==3) return 1;if(m == 2) return 0;if(m == 4) return 2;if(m&1) return 0;if(get_sg1(m/2) == 1) return 2;return 1;} int get_sg2(int m) {if(m == 1) return 1;if(m == 2) return 2;if(m & 1) return 0;return 1;}int main() {    //freopen("input.txt", "r", stdin);int n, k;cin >> n >> k;for(int i = 1; i <= n; i++) scanf("%d", &a[i]);int ans = 0;if(k&1) {for(int i = 1; i <= n; i++) ans ^= get_sg1(a[i]);} else {for(int i = 1; i <= n; i++)ans ^= get_sg2(a[i]);}if(ans) puts("Kevin");else puts("Nicky");    return 0;}

0 0
原创粉丝点击