|
|
|
@ -10,7 +10,7 @@ int dfs(int a, int b) {
|
|
|
|
|
if (!a) return v = b % 2; // 奇数为先手必胜,偶数为先手必败
|
|
|
|
|
|
|
|
|
|
// 一般5个情况 + 1个特殊情况
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 特殊情况: 如果操作后出现b中只有一堆,且堆中石子个数为1
|
|
|
|
|
// 那么应该归入到a中,并且b为0
|
|
|
|
|
// 以下所有情况,如果能进入必败态,先手则必胜!
|
|
|
|
@ -41,14 +41,13 @@ int main() {
|
|
|
|
|
while (T--) {
|
|
|
|
|
cin >> n;
|
|
|
|
|
int a = 0, b = 0;
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
|
for (int i = 0; i < n; i++) { // n堆石子
|
|
|
|
|
int x;
|
|
|
|
|
cin >> x;
|
|
|
|
|
if (x == 1) a++;
|
|
|
|
|
// b != 0时 加1堆 + 加x石子 = 原来的 + x + 1 (其实就是区别一开始的时候)
|
|
|
|
|
// 当b != 0时, 我们往后加的delta
|
|
|
|
|
// b == 0时 加1堆 + 加x石子 = 0 + 1 + x - 1 = x
|
|
|
|
|
// 注意操作符优先级
|
|
|
|
|
if (x == 1) a++; // 每堆石子的数量
|
|
|
|
|
// b==0时 加1堆+加x石子=0 + 1+x-1=x
|
|
|
|
|
// b!=0时 加1堆+加x石子=原来的+x+1
|
|
|
|
|
// 偏移量是1个,在b=0时,需要考虑引入这个偏移量:-1,在b>0时,就不必再次考虑了
|
|
|
|
|
else
|
|
|
|
|
b += b ? x + 1 : x;
|
|
|
|
|
}
|
|
|
|
|