893. 集合-Nim游戏

#include

using namespace std;

const int N=110,M=100010;

int n,m;
int s[N],f[M];

int SG(int x)
{
    if(f[x]!=-1)    return f[x];
    
    unordered_set<int> S;
    for(int i=0;i<m;i++)
    {
        int sum=s[i];
        if(x>=sum)
        {
            S.insert(SG(x-sum));
        }
    }
    
    for(int i=0;;i++)
    {
        if(!S.count(i))
        {
            return f[x]=i;
        }
    }
}

int main()
{
    cin>>m;
    for(int i=0;i<m;i++)    cin>>s[i];
    
    cin>>n;
    
    memset(f,-1,sizeof f);
    int res=0;
    while(n--)
    {
        int x;
        cin>>x;
        res^=SG(x);
    }
    
    if(res) puts("Yes");
    else    puts("No");
    
    return 0;
}

好像还是比较简单,SG函数的数值求一个异或值即可

f数组存的是SG函数的数值

S存的是每一个有向图的结点

函数的最后一个部分模拟的是Mex运算,求出不属于集合S的最小非负整数的运算

你可能感兴趣的:(#,acwing算法基础,游戏,哈希算法,算法)