題意:Nim問題,有n堆石子,a1<=a2<=a3........<=an<=L.兩個人輪流給任意一堆添加石子,保證每堆石子的數量符合上述條件,如果當前這個人不能給任何堆添加石子就算輸,問,是第一個人贏還是第二個人贏。
思路:將每堆石子數量的差值異或,值爲0就代表第一個下手的人輸。
code:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a[25];
int n,L;
int main()
{
int t;
int cnt=1;
scanf("%d",&t);
while(t--)
{
int ans=0;
scanf("%d%d",&n,&L);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
a[n]=L;
for(int i=0;i<n;i+=2)
{
ans^=a[i+1]-a[i];
}
printf("Case %d: ",cnt++);
if(ans)
printf("First Player\n");
else
printf("Second Player\n");
}
return 0;
}