HDU-3389 Game
Game
两个人互相博弈,每次轮流操作,给出 \(n\) 个盒子,每个盒子中有0个或若干个石头,编号为 \(1\) 到 \(n\),每次操作可以选取一个非空盒子 A 和一个盒子 B,要求 B < A 且 (A+B) % 2 == 1 且 (A+B) % 3 == 0,并将A中的任意数量的石子放到B中,至少放一个。如果不能进行该操作则该玩家输
阶梯博弈
先通过构建有向边,发现 1,3,4 号盒子没有办法再进行转移,所以最后所有的石子都会集中到 1,3,4 号盒子中
接着通过观察发现,盒子的号数转移是有规律的,x % 6 == 1 号盒子必然只能转移到 x % 6 == 2,且 x % 6 == 2 号盒子必然只能转移到 x % 6 == 1
同理 x % 6 == 0 和 x % 6 == 3, x % 6 == 5 和 x % 6 == 4
这样我们就会发现,无论怎么转移,x % 6 == 1, x % 6 == 3, x % 6 == 4 的盒子,转移到最终盒子都是要经过偶数步
x % 6 == 2, x % 6 == 0, x % 6 == 5 的盒子,转移到最终盒子都是要经过奇数步
根据阶梯博弈的原则,我们可以理解为偶数步无用(走一步成为奇数步后,后手可以继续走,将其转移为偶数步),奇数步符合尼姆博弈
#include <iostream>
using namespace std;
int main()
{
int t;
cin >> t;
for(int k=1; k<=t; k++)
{
int n;
cin >> n;
int sum = 0;
for(int i=1; i<=n; i++)
{
int x;
cin >> x;
if(i % 6 == 2 || i % 6 == 0 || i % 6 == 5)
sum ^= x;
}
cout << "Case " << k << ": ";
if(sum) cout << "Alice" << endl;
else cout << "Bob" << endl;
}
return 0;
}