Codeforces Round #334 E. Lieges of Legendre (组合游戏)
来源:互联网 发布:网络与生活论文2000字 编辑:程序博客网 时间:2024/06/05 00:45
题意:
给定n,k≤109,然后组合游戏的规则,不同的是只有2种操作
1.任选1堆拿走一个,2.选一个2x个数堆变成k堆x个的
问谁赢
分析:
只看第二种操作,发现k分奇偶
奇数的话sg(2x)=sg(x)⊕sg(x)⋯⊕sg(x)k times=sg(x)
偶数的话sg(2x)=sg(x)⊕sg(x)⋯⊕sg(x)k times=0
n,k这么大显然打表找规律了
根据这个打个表发现很有规律,除了前几项
k->oddi : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20sg: 0 1 0 1 2 0 2 0 1 0 1 0 1 0 1 0 2 0 1 0 2k->eveni : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20sg: 0 1 2 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
k奇数是前5项没规律,然后后面的奇数项都是0,偶数项不是1就是2
k偶数前3项没规律,然后后面的奇数项都是1,偶数项都是0
证明也很简单,induction就好了
代码:
//// Created by TaoSama on 2015-12-02// Copyright (c) 2015 TaoSama. All rights reserved.////#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;#define pr(x) cout << #x << " = " << x << " "#define prln(x) cout << #x << " = " << x << endlconst int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;int n, k;/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0 1 0 1 2 0 2 0 1 0 1 0 1 0 1 0 2 0 1 0 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0 1 2 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1*/int odd[5] = {0, 1, 0, 1, 2}, even[3] = {0, 1, 2};int getSg(int x) { if(k & 1) { if(x < 5) return odd[x]; if(x & 1) return 0; return getSg(x >> 1) == 1 ? 2 : 1; } else { if(x < 3) return even[x]; return (x & 1) ^ 1; }}int main() {#ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);// freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);#endif ios_base::sync_with_stdio(0); while(scanf("%d%d", &n, &k) == 2) { int ans = 0; for(int i = 1; i <= n; ++i) { int x; scanf("%d", &x); ans ^= getSg(x); } puts(ans ? "Kevin" : "Nicky"); } return 0;}/*int getSg(int x) { if(k & 1) { if(!x) return 0; if(~sg[x]) return sg[x]; set<int> s; s.insert(getSg(x - 1)); if(!(x & 1)) s.insert(getSg(x >> 1)); for(int i = 0; ; ++i) if(!s.count(i)) return sg[x] = i; } else { if(!x) return 0; if(~sg[x]) return sg[x]; set<int> s; s.insert(getSg(x - 1)); if(!(x & 1)) s.insert(0); for(int i = 0; ; ++i) if(!s.count(i)) return sg[x] = i; }}*/
0 0
- Codeforces Round #334 E. Lieges of Legendre (组合游戏)
- Codeforces Round #334 E. Lieges of Legendre(SG)
- Codeforces Round #334 (Div. 2) C. Lieges of Legendre
- CodeForces 603C/604E Lieges of Legendre SG函数
- codeforces 604 E. Lieges of Legendre (sg函数)
- codeforces 604 E. Lieges of Legendre (sg函数)
- 【Codeforces Round 334 (Div 2)E】【博弈-SG函数】Lieges of Legendre n个数 每次取数-1或者变2x为k个x的博弈
- codeforces #334 div1 603C Lieges of Legendre(博弈)
- CodeForces 603C Lieges of Legendre (SG函数)
- codeforces 603C. Lieges of Legendre(博弈+SG函数)
- [Codeforces 603C]Lieges of Legendre
- nim博弈 Codeforces603C Lieges of Legendre
- Educational Codeforces Round 5 E. Sum of Remainders(数学)
- Codeforces Round #399:E. Game of Stones
- [Codeforces 711E] ZS and The Birthday Paradox (数学+Legendre公式)
- Codeforces Round #258 (Div. 2)E(组合数+容斥原理)
- codeforces Round#369 div2-E ZS and The Birthday Paradox(逆元,组合)★
- Educational Codeforces Round 33 (Rated for Div. 2) E. Counting Arrays(组合数学)
- 黑马程序员_final关键字
- Codeforces Round #334 D. Moodular Arithmetic(置换)
- PAT1001
- PAT1002
- 黑马程序员_抽象类
- Codeforces Round #334 E. Lieges of Legendre (组合游戏)
- qt pro 里面变量的引用
- POJ 2632 Crashing Robots
- Eclipse 断点不起作用的原因
- QT+CUDA7.5+UBUNTU14.04
- 113 经验 关于提升开发效率
- 【问鼎杯】3-2关卡writeup
- 6. 在DIRECT3D中绘图
- [LeetCode202]Happy Number