Problem Description
m堆石子,兩人輪流取.只能在1堆中取.取完者勝.先取者負輸出No.先取者勝輸出Yes,然後輸出怎樣取子.例如5堆 5,7,8,9,10先取者勝,先取者第1次取時可以從有8個的那一堆取走7個剩下1個,也可以從有9個的中那一堆取走9個剩下0個,也可以從有10個的中那一堆取走7個剩下3個.
Input
輸入有多組.每組第1行是m,m<=200000. 後面m個非零正整數.m=0退出.
Output
先取者負輸出No.先取者勝輸出Yes,然後輸出先取者第1次取子的所有方法.如果從有a個石子的堆中取若干個後剩下b個後會勝就輸出a b.參看Sample Output.
Sample Input
2
45 45
3
3 6 9
5
5 7 8 9 10
0
Sample Output
No
Yes
9 5
Yes
8 1
9 0
10 3
道題類似於問你有多少種方法能把這幾個數的異或變成0。
我們知道如果異
或不爲0的時候我們只要用一堆的數減去異或的結果就可以了 ,
但是如果這個堆的數如
果小於異或的結果就不行了
所以我們要看每個堆的數是否大於異或的結果就知道有多少種方法了
#include "stdio.h"
int a[200005];
int main() {
int m;
while(scanf("%d",&m)==1 &&m) {
int s = 0;
for(int i = 0; i < m; i++) {
scanf("%d", &a[i]);
s ^= a[i];
}
if(!s)
printf("NO\n");
else {
puts("Yes");
for(int i = 0; i < m; i++) {
int st = s ^ a[i];
if(st < a[i]) printf("%d %d\n", a[i], st);
}
}
}
return 0;
}