题目:https://www.luogu.org/problemnew/show/P1247
NIM游戏裸题。看看异或和,若不为0就必胜,只要维持对方先手是0(直到最后)就行。
若a[i]>a[i]^sum,其实a[i]的第(sum的最高位)位一定是1。
#include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; const int N=5e5+5; int n; ll a[N],sum; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); sum^=a[i]; } if(!sum)printf("lose"); else { int k=0; for(int i=1;i<=n;i++) if(a[i]>(a[i]^sum)){k=i;break;}//也就是第一个第(sum的最高位)位是1的数 printf("%lld %d ",a[k]-(a[k]^sum),k);//上一行不是<=!因为不能不取 a[k]=a[k]^sum; for(int i=1;i<=n;i++) printf("%lld ",a[i]); } return 0; }