欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

BeingaGoodBoyinSpringFestival一些超详细的推导

时间:2023-04-30

m堆牌,每次只能选择一堆牌抽取任意张(所以sg(n)=n)。

用s储存所有sg函数的异或值。根据题意可以知道是如果选择a【i】(第i堆,牌数为a【i】)最多可以抽a[i]张(废话),怎么样可以取胜呢——令抽取了x张牌后的nim和等于0。也就是说,s^a[i]^(a[i]-x)==0; (s^a[i]等于除了a[i]之外所以数的异或值)又因为一个数和它本身求异或值的话也就等于0,所以可以得出s^a[i]==a[i]-x (抽任意张牌,x肯定大于0),又因为x到底是几我们不确定,但是肯定大于零,所以可以把判断条件写为(a[i]>(s^a[i])),又因为运算符的优先级,所以要加括号。然后就是计数p++

#include#includeusing namespace std;int m, p,s; int a[101];int main() {while (cin >> m) {if ( m == 0)break;s = 0;for(int i = 1; i <= m;i++) {cin >>a[i];s = s^a[i];//异或的和}for (int i = 1; i <= m; i++) {if (a[i] > (s ^ a[i]))p++;}if (s==0)cout << 0<< endl;else cout <

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。