【牛客7872 D】尼姆博弈
阿新 • • 發佈:2020-10-31
【牛客7872 D】尼姆博弈
題意
A和B玩遊戲,給n個數,每次能對一個數進行操作,如果一個數是1那麼不能對它進行操作。每次操作可以選擇這個數x大於1的因子a,把這個數變成x/a。最後無法操作的人輸。
問誰能贏?
題解
這是一道比較裸的尼姆博弈題,尼姆博弈是n堆石子,每堆石子有一定數量的石子,每次可以取一堆中一部分石子或者整堆取走,但是不能不取。對應到這道題目裡,選擇一個>1&&<自身的因此就相當於取走了一部分石子,選擇自身這個因子就相當於直接整堆取走。那麼每堆石子有多少個呢,答案就是這個數的質因子個數。然後根據尼姆博弈的結論,判斷異或和是否為0,若為0則先手必敗,反之則先手必勝。
Code
/**************************** * Author : W.A.R * * Date : 2020-10-31-20:53 * ****************************/ /* */ #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #include<map> #include<unordered_map> #include<stack> #include<string> #include<set> #define mem(a,x) memset(a,x,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1e6+10; const ll mod=1e9+7; int main(){ ll n,ans=0,x;scanf("%lld",&n); for(ll i=1;i<=n;i++){ scanf("%lld",&x); ll sum=0; for(ll j=2;j*j<=x;j++)while(x%j==0)x/=j,sum++; if(x>1)sum++; ans^=sum; } if(ans)printf("CC yyds!\n"); else printf("TT txdy!\n"); return 0; }