1. 程式人生 > 實用技巧 >【牛客7872 D】尼姆博弈

【牛客7872 D】尼姆博弈

【牛客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;
}