HDU 3032 Nim or not Nim(SG函数打表找规律)

来源:互联网 发布:网络上gm是什么意思啊 编辑:程序博客网 时间:2024/05/16 10:06

解题思路:

通过打表发现,当x % 4 == 0 的时候SG值为x - 1,当x % 4 == 3的时候SG值为x + 1,其他时候SG值为x;

//AC代码#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <vector>#include <map>#include <set>#include <algorithm>using namespace std;const int MAXN = 1000 + 10;int main(){    int T;    scanf("%d", &T);    while(T--)    {        int n, x;        scanf("%d", &n);        int ans = 0;        for(int i=0;i<n;i++)        {            scanf("%d", &x);            if(x % 4 == 0) ans ^= (x - 1);            else if(x % 4 == 3) ans ^= (x +1);            else ans ^= (x);        }        if(ans) printf("Alice\n");        else printf("Bob\n");    }    return 0;}

//打表代码#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <vector>#include <map>#include <set>#include <algorithm>using namespace std;const int MAXN = 1000 + 10;int vis[MAXN];int SG[MAXN];int mex(int x){    if(SG[x] != -1)        return SG[x];    memset(vis, 0, sizeof(vis));    for(int i=1;i<=x/2;i++)        vis[mex(i) ^ mex(x-i)] = 1;    for(int i=1;i<=x;i++)        vis[mex(x-i)] = 1;    for(int i=0;;i++) if(!vis[i])    {        SG[x] = i;        break;    }    return SG[x];}int main(){    memset(SG, -1, sizeof(SG));    for(int i=0;i<100;i++)        SG[i] = mex(i);    for(int i=0;i<100;i++)    {        printf("%d %d\n", i, SG[i]);    }    return 0;}


0 0
原创粉丝点击