(博弈论)Even Number Addicts

发布时间 2023-06-14 17:31:08作者: o-Sakurajimamai-o

Alice 和 Bob 正在一个序列 ai 上玩游戏,Alice 先手,轮流玩。每一轮当前玩家可以取走序列中任意一个数,直到取完。

如果最后 Ailce 取走的数的和为偶数,则 Ailce 赢,否则 Bob 赢。保证每个人用最优策略玩。对于每组数据,输出赢家。

输入输出样例

输入 #1
4
3
1 3 5
4
1 3 5 7
4
1 2 3 4
4
10 20 30 40
输出 #1
Alice
Alice
Bob
Alice

共识:奇数 + 奇数 = 偶数;奇数 + 偶数 = 奇数;偶数 + 偶数 = 偶数。

统计序列 a 中偶数 ai 和奇数 ai 分别出现的次数 e、o,依次可确定下列几种情况,决定二人胜负态:

  1. 当 ≡2(mod4)o2(mod4) 时, Bob 存在必胜态;

Bob 仅需保证每次所取数字与 Alice 所取数字奇偶性相同即可,这样可以使二者取走的奇数个数相同。若在此过程中 Alice 取走了最后一个偶数,奇数必然剩余偶个。随后,Alice 和 Bob 各自将选择剩余奇数的一半。最后,Alice 和 Bob 都拥有 22o 个奇数,Alice 和为奇数,Alice 败。

  1. 当 ≡3(mod4)o3(mod4) 时, Alice 存在必胜态;

Alice 首先选择一个奇数,若 Bob 能从剩下的数字中取走偶个奇数,则 Bob 胜。从情况 1 中可知,Bob 必败。

  1. 当 ≡0(mod4)o0(mod4) 时, Alice 存在必胜态;

Alice 首先选择一个偶数,在随后的操作中,Alice 仅需保证每次所取数字与 Bob 所取数字奇偶性相同即可,这样可以使二者取走的奇数个数相同。若在此过程中偶数被取完,奇数必然剩余偶个。随后,Alice 和 Bob 各自将选择剩余奇数的一半。最后,Alice 和 Bob 都拥有 22o 个奇数,Alice 和为偶数,Alice 胜。

  1. 当 ≡1(mod4)o1(mod4) 时,先选择奇数的人败。

先选择奇数的人将会导致对手出现情况 3,对手必胜。博弈开始时,如果 e 为偶即 ≡0(mod2)e0(mod2),则 Bob 将会取走最后一个偶数,Alice 败;e 为奇即 ≡1(mod2)e1(mod2),则 Alice 胜。

//https://www.luogu.com.cn/problem/CF1738C
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int num1,num2,n,res,t;
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            int a;
            cin>>a;
            if(a%2==0) num2++;
            else num1++;
        }
        if(num1%4==0||num1%4==3||(num1%4==1&&num2%2==1)) cout<<"Alice"<<endl;
        else cout<<"Bob"<<endl;
    }
    return 0;
}