网站设计公司网站制作费用,网站建设需求单,上海企业网站制作费用,工商注册核名查询官网P1247 取火柴游戏
题意#xff1a;
有n堆火柴#xff0c;两个人轮流操作#xff0c;每次只能在从一堆中取若干火柴#xff0c;拿走最后一根火柴的为胜者#xff0c;给你一个状态#xff0c;问先手是赢是输
题解#xff1a;
很经典的nim博弈#xff0c;结论大家应该…P1247 取火柴游戏
题意
有n堆火柴两个人轮流操作每次只能在从一堆中取若干火柴拿走最后一根火柴的为胜者给你一个状态问先手是赢是输
题解
很经典的nim博弈结论大家应该都知道就是全部堆数异或起来为0则先手输否则先手赢 答案还要求输出第一次取的情况所有异或后得到state会存在一个i使得a[i] ^ state a[i],这里可以理解成从a[i]中取取的数量就是state ^ a[i] 洛谷某大佬的详细证明
代码
#includebits/stdc.h
#define debug(a,b) printf(%s %d\n,a,b);
typedef long long ll;
using namespace std;inline int read(){int s0,w1;char chgetchar();while(ch0||ch9){if(ch-)w-1;chgetchar();}while(ch0ch9) ss*10ch-0,chgetchar();//s(s3)(s1)(ch^48);return s*w;
}
const int maxn5e59;
int a[maxn];
int main()
{int k;int state0;cink;for(int i1;ik;i)cina[i],state^a[i];if(state0)printf(lose);else {for(int i1;ik;i){if((a[i]^state)a[i]){printf(%d %d\n,a[i]-(state^a[i]),i);for(int j1;jk;j){if(j!i)printf(%d ,a[j]);else printf(%d ,state^a[i]);}break;}}}return 0;
}