绝对值博弈【牛客tracker 每日一题】
2026/8/31 15:20:35 网站建设 项目流程

绝对值博弈

时间限制:1 秒
空间限制:256 MB


网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!

题目描述

Alice 和 Bob 在玩一款全新的关于绝对值的博弈游戏。

给定一个包含n nn不同整数的集合A AA,双方轮流进行以下操作:

  1. 选择集合A AA中两个不同的整数x xxy yy
  2. 判定整数∣ x − y ∣ |x - y|xy
    • ∣ x − y ∣ |x - y|xy也在集合A AA中,则执行此次操作的玩家立刻掉这场游戏;
    • ∣ x − y ∣ |x - y|xy不在集合A AA中,则将整数∣ x − y ∣ |x - y|xy插入到集合A AA中,随后交替到对方操作。

Alice 想知道,如果自己先手,且自己和 Bob 都采取最优策略,最终谁能获胜?


输入描述

第一行包含一个整数n ( 2 ≤ n ≤ 100 ) n\ (2 \le n \le 100)n(2n100),表示集合中初始元素的数量。

第二行包含n nn个不同的空格分隔的整数a 1 , a 2 , … , a n ( 1 ≤ a i ≤ 10 9 ) a_1, a_2, \dots, a_n\ (1 \le a_i \le 10^9)a1,a2,,an(1ai109),表示集合中的元素。


输出描述

如果 Alice 在最优策略下能够赢得游戏,请输出Alice;否则输出Bob


示例

示例 1

输入:

2 2 3

输出:

Alice

数据范围与提示

解题思路

本题是组合博弈 + 数论性质的题型。表面上双方每次选择两个数做差,但博弈的胜负其实由初始集合的最大公约数决定,可以转化为确定步数的取石子游戏。

1. 问题等价转化
2. 算法实现
  1. 读入n nn和数组a aa
  2. 计算所有数的最大公约数g,以及最大值mx
  3. need = mx / g - n
  4. need为奇数,输出Alice;否则输出Bob
3. 复杂度分析

总结

游戏过程可以被抽象为固定长度的“安全补数”过程:所有操作均保持 gcd 不变,最终集合必然扩展为[ g , m x ] [g, mx][g,mx]内所有g gg的倍数。因此总安全操作次数是固定的,胜负仅由该次数的奇偶性决定,与玩家的具体选择无关。

代码简要说明

  1. 读入n nn,初始化最大值mx=0,最大公约数ag=0
  2. 遍历输入:
    • 更新mx
    • ag仍为0 00,将当前数字赋值给ag
    • 否则更新ag = gcd(ag, num)
  3. 计算odd = ((mx / ag - n) % 2 == 1)
  4. 根据odd输出AliceBob

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;llgcd(ll a,ll b){ll x,y,tmp;if(a>b){x=a;y=b;}else{x=b;y=a;}while(y){tmp=x%y;x=y;y=tmp;}returnx;}intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll n;cin>>n;ll mx=0,ag=0;for(ll i=0;i<n;i++){ll num;cin>>num;if(num>mx)mx=num;if(ag==0)ag=num;elseif(ag!=1)ag=gcd(ag,num);}boolodd=((mx/ag-n)%2==1);if(odd)cout<<"Alice"<<endl;elsecout<<"Bob"<<endl;return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询