luogu P1247
#include <cstdio> using namespace std; int n,a[500010],ans; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); ans=a[1]; for(int i=2;i<=n;i++)ans^=a[i]; if(!ans)puts("lose"); else { for(int i=1;i<=n;i++){ if(a[i]>=(ans^a[i])){ printf("%d %d\n",a[i]-(ans^a[i]),i); a[i]=ans^a[i]; break; } } for(int i=1;i<=n;i++)printf("%d ",a[i]); puts(""); } return 0; }
如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设 a < b< c,我们只要将 c 变为 a^b,即可,因为有如下的运算结果: a^b^(a^b)=(a^a)^(b^b)=0^0=0。要将c 变为a^b,只从 c中减去 c-(a^b)