codeforces 15C. Industrial Nim

题目链接:http://codeforces.com/problemset/problem/15/C



$NIM$游戏是次要的,直接异或石头堆就可以了,问题在于给出的石头堆的数量极多。

考虑利用异或的性质。

一共给出了$n$段石头堆,每段中石头堆的数量是连续的。

在$x$是偶数时${x^(x+1)=1}$,利用这个性质我们就可以${O(1)}$的算出每一段石头的异或和。


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 10010
10 #define llg long long
11 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
12 llg n,m,T,ans,x;
13 int main()
14 {
15     yyj("nim");
16     cin>>T;
17     while (T--)
18     {
19         llg xo=0;
20         cin>>x>>n;
21         m=x+n-1;
22         if (x%2) xo^=x,n--;
23         if ((n/2)%2) xo^=1;
24         if (n%2) xo^=m;
25         ans^=xo;
26     }
27     if (ans) cout<<"tolik";else cout<<"bolik";
28     return 0;
29 }
30 //对于一个数x%2=0,x^(x+1)=1
时间: 2024-10-21 07:06:32

codeforces 15C. Industrial Nim的相关文章

Codeforces 15C Industrial Nim 简单博弈

题目链接:点击打开链接 题意: 给定n 下面n行,每行2个数u v 表示有v堆石子:u,u+1,u+2···u+v-1 问先手必胜还是后手必胜 思路: 首先根据Nim的博弈结论 把所有数都异或一下,看结果是0还是非0 而这里因为数字太多所以想优化 那么其实对于一个序列 u, u+1, u+2 ···· 显然 {4,5} {,6,7}, {8,9} 这样2个一组的异或结果就是1 那么只需要把序列分组,分成{偶数,奇数} 然后Y一下.. #include<stdio.h> #include<

CodeForces - 662A Gambling Nim

http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概率是在正面,各个卡牌独立.求把所有卡牌来玩Nim游戏,先手必胜的概率. (⊙o⊙)-由于本人只会在word文档里写公式,所以本博客是图片格式的. Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm

Codeforces 812E(Nim变形)

题意:一棵树(1为根,所有叶子节点深度同奇偶),每个节点上有一些苹果.现有两种操作:1.吃掉叶子节点上的苹果:2.将非叶子节点上的苹果送给儿子节点.两人轮流操作,无法操作的人输,现在后手玩家可以任意交换两个节点的苹果数,问有多少种交换方法使得后手胜利(必须交换). 题解:将所有节点分为两类,深度与叶子节点同奇偶(蓝).深度与叶子节点奇偶不同(红).有结论:当所有蓝色节点异或和为 0 时,后手必胜.因此需要寻找有多少种交换方法可以使得蓝色节点异或和为0. 证明:可以将所有的蓝色节点看作Nim游戏中

Codeforces Round #417 (Div. 2) E. Sagheer and Apple Tree(树上Nim)

题目链接:Codeforces Round #417 (Div. 2) E. Sagheer and Apple Tree 题意: 给你一棵树,每个节点有a[i]个苹果,有两个人要在这个树上玩游戏. 两个人轮流操作,谁不能操作谁就输了. 这个树有一个特性:叶子到根的距离的奇偶性相同. 每次操作可以选一个节点i,和一个数x,x小于当前节点i的苹果数. 对于节点i,如果是叶子节点,就将这x个苹果吃掉. 如果是非叶子节点,就将这x个苹果移向节点i的任意儿子节点. 现在第二个操作的人要交换两个节点的苹果

codeforces 768 E 变形NIM博弈/手写sg函数

题意:给你n堆石头,在同一堆石头下不能取两次相同的数目,问能否后手胜 题解:设一堆石头最多能取k次不同的石头数目,有nim博弈可以知道只要每一堆石头能取的次数异或起来为0则为必败局,则YES #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <map> #include <queue> #include <ve

CodeForces - 662A:Gambling Nim (求有多少个子集其异或为S)(占位)

As you know, the game of "Nim" is played with n piles of stones, where the i-th pile initially contains ai stones. Two players alternate the turns. During a turn a player picks any non-empty pile and removes any positive number of stones from it

CodeForces - 744A Hongcow Builds A Nation

http://codeforces.com/problemset/problem/744/A 这是一道考察连通块的题(做之前, 连通块是什么都不清楚) Note:点的集合 任意两点都有可达的路径 可以用并查集做 在一个政府管辖下的点 作为一个集合 根节点就是这个政府 再者 贪心 : 要求做多可以添加的边数 做多一个集合 n个点 使它构成完全图 得到的边数为n*(n-1) / 2 那么最终表达式可以为n[1]*(n[1]-1) / 2 + n[2]*(n[2]-1) / 2 +....+ n[k]

第二十次codeforces竞技结束 #276 Div 2

真是状况百出的一次CF啊-- 最终还Unrated了,你让半夜打cf 的我们如何释怀(中途茫茫多的人都退场了)--虽说打得也不好-- 在这里写一下这一场codeforces的解题报告,A-E的 题目及AC代码,部分题目有简单评析,代码还算清晰,主要阅读代码应该不难以理解. Questions about problems # Author Problem When Question Answer       2014-11-05 21:24:38 Announcement General ann

Codeforces 2A Winner (map运用)

Winner Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on CodeForces. Original ID: 2A 64-bit integer IO format: %I64d      Java class name: (Any) Prev Submit Status Statistics Discuss Next Type: None None Graph Theory      2-SAT