1. 程式人生 > >HDU 3537 Daizhenyang's Coin

HDU 3537 Daizhenyang's Coin

連結

[http://acm.hdu.edu.cn/showproblem.php?pid=3537]

題意

題意:已知一排硬幣中有n個硬幣正面朝上,輸入正面朝上的硬幣的位置ai。兩人輪流操作,
每次操作可以翻轉1,2,或則3枚硬幣,其中翻轉的最右的硬幣必須是正面朝上的,最後不能翻轉的為負

分析

妮姆博奕變形&&找規律

程式碼

#include<iostream>
#include<string.h>
#include<map>
using namespace std;
int sg[105];
bool vis[1000];
map<int,bool> ma;
void get_sg(){
    sg[0]=1;
    int i,j,k;
    for(i=1;i<=100;i++){
        memset(vis,0,sizeof(vis));
        vis[0]=1;
        for(j=0;j<i;j++) vis[sg[j]]=true;
        
        for(j=0;j<i;j++)
        for(k=0;k<j;k++)
        vis[sg[j]^sg[k]]=1;
           for(j=0;;j++)
            if(!vis[j]) break;
            sg[i]=j;
            cout<<i<<' '<<sg[i]<<endl;
    }
} 
bool jiou(int x){
    int cnt=0;
    while(x){
        if(x&1) cnt++;
        x>>=1;
    }
    if(cnt&1) return 1;
    else return 0;
}
int main(){
    //get_sg();
    int n,a;
    while(cin>>n){
        ma.clear();
        int ans=0;
        while(n--){
            cin>>a;
            if(!ma[a])
            {
                if(jiou(a)) ans^=2*a;
                else ans^=2*a+1;
                ma[a]=1;
            }
        }
        if(ans) cout<<"No\n";
        else cout<<"Yes\n";
    }
    return 0;
}