不管是否使用技能,发现操作前后所有堆二进制中1的个数之和不变。那么对于一个堆其实可以等价转换为一个k个石子的堆(k为该数二进制的个数),然后就是个nim游戏。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,n,ans,a[101]; 4 int main(){ 5 scanf("%d",&t); 6 for(int ii=1;ii<=t;ii++){ 7 scanf("%d",&n); 8 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 9 ans=n%2; 10 for(int i=1;i<=n;i++) 11 while (a[i]){ 12 ans^=a[i]%2; 13 a[i]>>=1; 14 } 15 if (ans)printf("Case %d: Yes\n",ii); 16 else printf("Case %d: No\n",ii); 17 } 18 }