TYVJ 2049 魔法珠 sg函数

题意:链接

方法:sg函数

解析:

tyvj的题大部分都没题解啊- - 不过这样貌似会更好?感觉做这的题都需要自己动脑啊- - 虽然嘴上说着好烦然而心里觉得好评?

回归正题

设sg[x]表示数x的sg值,这好像是废话

然后对于读入的a[i],将所有的a[i]的sg值异或起来如果不是零则先手赢反之后手

维护的时候有个坑。

每次求约数的时候,数组要在sg里开,因为如果递归下去的话,全局变量的话会被更改,会被坑死。

然后就是怎么维护了

对于x,先求约数

之后枚举哪个数不取,将其他的异或(或者先都异或起来的和去跟每个异或会更快)

然后就AC了

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 110
using namespace std;
int n,cnt;
int num[N];
int sg[1010];
int b[1100];
void get(int x)
{
    cnt=1,b[cnt]=1;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            if(i*i==x)b[++cnt]=i;
            else b[++cnt]=i,b[++cnt]=x/i;
        }
    }
}
int ssgg(int x)
{
    if(sg[x]!=-1)return sg[x];
    int v[1010];memset(v,0,sizeof(v));
    get(x);
    int tot=cnt,cal[110];
    for(int i=1;i<=cnt;i++)cal[i]=b[i];
    for(int i=1;i<=tot;i++)
    {
        int ans=0;
        for(int j=1;j<=tot;j++)
        {
            if(i==j)continue;
            ans^=ssgg(cal[j]);
        }
        v[ans]=1;
    }
    for(int i=0;;i++)if(!v[i])return sg[x]=i;
}
int main()
{

    while(~scanf("%d",&n))
    {
        memset(sg,-1,sizeof(sg));sg[1]=0;
        for(int i=1;i<=n;i++)scanf("%d",&num[i]);
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            ans^=ssgg(num[i]);
        }
        if(ans)printf("freda\n");
        else printf("rainbow\n");
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 07:02:07

TYVJ 2049 魔法珠 sg函数的相关文章

hdu1848 Fibonacci again and again(SG函数博弈)

现在换是看不明白SG函数的求法什么的 暂时先当模板题吧 函数mex1就是求g(x) 然后异或 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int k,fibo[100],f[10001]; int mex1(int p){ int i,t; bool g[101]={0}; for(i=0;i<k;i++){

HDU 2897-邂逅明下(sg函数)

邂逅明下 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2897 Appoint description:  System Crawler  (2015-03-13) Description 当日遇到月,于是有了明.当我遇到了你,便成了侣. 那天,日月相会,我见到了你.而且,大地失去了光辉,你我是否成侣?这注定是个凄美的故事.(以上是废

hdu 1536 S-Nim 博弈论,,求出SG&#39;函数就可以解决

S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4975    Accepted Submission(s): 2141 Problem Description Arthur and his sister Caroll have been playing a game called Nim for some time now

SG函数

转自:Angel_Kitty Sprague-Grundy定理(SG定理): 游戏和的SG函数等于各个游戏SG函数的Nim和.这样就可以将每一个子游戏分而治之,从而简化了问题.而Bouton定理就是Sprague-Grundy定理在Nim游戏中的直接应用,因为单堆的Nim游戏 SG函数满足 SG(x) = x.对博弈不是很清楚的请参照http://www.cnblogs.com/ECJTUACM-873284962/p/6398385.html进行进一步理解. SG函数: 首先定义mex(min

算法笔记--sg函数详解及其模板

sg函数大神详解:http://blog.csdn.net/luomingjun12315/article/details/45555495 模板: int f[N],SG[N]; bool S[M]; void getSG(int n) { memset(SG,0,sizeof(SG)); for(int i=1;i<=n;i++) { memset(S,false,sizeof(S)); for(int j=1;f[j]<=i&&j<M;j++) { S[SG[i-f

Nim 游戏、SG 函数、游戏的和

Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于"Impartial Combinatorial Games"(以下简称ICG).满足以下条件的游戏是ICG(可能不太严谨):1.有两名选手:2.两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动:3.对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作.以前的任何操作.骰子的点数

hdu1847(sg函数&amp;yy)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1847 题意:中文题诶- 思路:直接sg函数打表即可,观察打表的结果发现是有规律的,sg函数的值只为0, 1, 2,所以我们只需n%3即可得出答案; 回过头来我们可以这样想,对于3的倍数的数,无论如何操作,最后必定会到达3这点,因为每次只能减2的幂,那么显然这种情况下先手会败; 代码: 1 #include <iostream> 2 #include <string.h> 3 #defi

sg函数与博弈论

这个标题是不是看起来很厉害呢... 我们首先来看一个最简单的游戏.比如我现在有一堆石子,有p个,每次可以取走若干个(不能不取),不能取的人就输了. 现在假设有两个人要玩这个游戏,一个人先手,一个人后手,假设两个人都是足够聪明的AI,那么谁会赢? 显然p≠0时先手赢,他只要全部取完就行了... 我们先不管这个游戏有多傻逼,我们看一看这个游戏所隐含的模型. 比如我们把当前游戏局面抽象成一个点,把这个点往每下一步可以到达的新状态连一个边,这样就形成了一个有向无环图.(如果有环这个游戏就不会结束了) 现

poj 2960 S-Nim(SG函数)

S-Nim Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3694   Accepted: 1936 Description Arthur and his sister Caroll have been playing a game called Nim for some time now. Nim is played as follows: The starting position has a number of h