hdu5795 A Simple Nim 求nim求法,打表找sg值规律 给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作可以选择任意一堆取走任意个石子(不可以为空) 或者选择一堆,把它分成三堆,每堆不为空。求先手必胜,还是后手必胜。

/**
题目:A Simple Nim
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795
题意:给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作可以选择任意一堆取走任意个石子(不可以为空)
或者选择一堆,把它分成三堆,每堆不为空。求先手必胜,还是后手必胜。
思路:
组合游戏Nim;
计算出每一堆的sg值,然后取异或。异或和>0那么先手,否则后手。

对于每一堆的sg值求解方法:

设:sg(x)表示x个石子的sg值。sg(x) = mex{sg(x-1),sg(x-2),...,sg(0),sg(a)^sg(b)^sg(c) |(a+b+c==x)}
当sg(0) = 0;
sg(1) = 1;
sg(2) = 2;
sg(x>=3)就要通过上面式子算出来了。
通过打表可以发现规律。
当x>=3.如果x是8的倍数,那么sg=x-1.
如果(x+1)是8的倍数,那么sg=x+1.

*/

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int maxn = 1e6+10;
const int mod = 1e9+7;
int T, n;
int main()
{
    cin>>T;
    while(T--)
    {
        scanf("%d",&n);
        int ans = 0;
        for(int i = 0; i < n; i++){
            int x;
            scanf("%d",&x);
            if(x%8==0&&x!=0){
                ans ^= x-1;
            }else
            {
                if((x+1)%8==0){
                    ans ^= x+1;
                }else
                {
                    ans ^= x;
                }
            }
        }
        printf("%s\n",ans?"First player wins.":"Second player wins.");
    }
    return 0;
}
时间: 2024-10-25 07:57:17

hdu5795 A Simple Nim 求nim求法,打表找sg值规律 给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作可以选择任意一堆取走任意个石子(不可以为空) 或者选择一堆,把它分成三堆,每堆不为空。求先手必胜,还是后手必胜。的相关文章

取石子的几个找sg函数的问题

1.light oj 1296 :传送门 规则,n堆,每次可以从一堆取1到n/2个. 分析: 打表找sg规律,发现 if n&1 sg(x)=sg(x/2); else sg(x)=x/2; 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1000; /*打

hdu-5795 A Simple Nim(组合游戏)

题目链接: A Simple Nim Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 181    Accepted Submission(s): 119 Problem Description Two players take turns picking candies from n heaps,the player who picks

[hdu-5795]A Simple Nim 博弈 尼姆博弈 SG函数打表找规律

[题目]题目链接 Two players take turns picking candies from n heaps,the player who picks the last one will win the game.On each turn they can pick any number of candies which come from the same heap(picking no candy is not allowed).To make the game more int

Nim or not Nim?(hdu3032+SG函数)取走-分割游戏,经典

小k,终于忍不住了...正在笔记本上装win10,有点小激动. Nim or not Nim? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 3032 Description Nim is a two-player mathematic game of strategy in which players take turns remov

hdu_5795_A Simple Nim(打表找规律的博弈)

题目链接:hdu_5795_A Simple Nim 题意: 有N堆石子,你可以取每堆的1-m个,也可以将这堆石子分成3堆,问你先手输还是赢 题解: 打表找规律可得: sg[0]=0 当x=8k+7时sg[x]=8k+8, 当x=8k+8时sg[x]=8k+7, 其余时候sg[x]=x:(k>=0) 1 #include<cstdio> 2 3 int main() 4 { 5 int t,n,ans,tp; 6 scanf("%d",&t); 7 while

HDU 3032 Nim or not Nim?(博弈 SG打表找规律)

传送门 Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1457    Accepted Submission(s): 720 Problem Description Nim is a two-player mathematic game of strategy in which players take

【HDU3032】【Lasker&#39;s Nim(一种Nim游戏)】Nim or not Nim? Multi-SG博弈、打表

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42652745 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意:n堆石子,每次可以从某堆中拿走若干,也可以把此堆分成两个非空堆,谁无法操作了谁输. 题解:首先我们可以打个SG函数来暴力出解,但是显然这会T. 但是不要害怕,我们打完以后发现了一个貌似对的规律: 对于所有的k >= 0,有 sg( 4k+1 ) = 4k+1: sg( 4k+2 ) = 4k+2: sg(

HDU Nim or not Nim? (Nim,sg函数)

题意:给出几堆石子数量,每次可以取走一堆中任意数量的石头,也可以将一堆分成两堆,而不取.最后取走者胜. 思路:石子数量很大,不能直接算,sg打表找出规律:正常情况下a[i]=i,但是有例外的,就是i%4=0和i%4=3的sg值是交换了的,所以要算某个状态的sg值时,若模4为0,则进行自减,若模4为3则进行自加,这样就得到了sg值.最后再求全部异或和.若0,则先手输.否则先手胜. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const

在AIX上配置NIM以及nim的mksysb备份

本文主要讲配置NIM以及mksysb方式的nim备份 首先以个小问题的形式来明确mksysb跟spot: 描述:A机OS level是AIX7.1TL2SP2 B机OS level也是AIX7.1TL2SP2现在A机与B机都需要升级到AIX7.1TL3SP5,在nim server端给A机做了mksysb(A_mksysb),给B机也做了mksysb(B_mksysb),现在用A_mksysb做了一个 spot(A_spot),但是没有用B_mksysb做spot问题1:升级过程中,A机与B机都