首页 > 代码库 > Codeforces 346A Alice and Bob 博弈
Codeforces 346A Alice and Bob 博弈
http://codeforces.com/problemset/problem/346/A
题意:A和B两个人进行游戏,每人轮流操作,每次从集合(集合元素个数n<=100)取出两个数x,y将|x-y|放入集合中 (|x-y|不存在集合中)不能操作则输
最终游戏结束的标志是无法取出两个数字,他们的差值不在序列中。也就是说,最终状态是一个首项等于公差的等差序列。求出这个等差数列的项数-n,就是游戏进行的回合。
所以我们要先求出首项。设首项为d,接下来就是d+d,d+2d….后面几项都是首项的倍数
差值|x-y|为gcd(x,y)的倍数,所以肯定也为gcd(a1,a2..an)的倍数,首项最小为d=gcd(a1,a2..an)
ans = an / gcd(a1,a2..an) - n;
#include <bits/stdc++.h> using namespace std; const int N=2e5+20; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int a[N],n; int main() { while(cin>>n) { int mx=0,d; for(int i=0;i<n;i++) { cin>>a[i]; mx=max(mx,a[i]); if(i==0) d=a[i]; else d=gcd(d,a[i]); } int cnt=mx/d-n; //{d,2d,3d...kd,mx} if(cnt%2) puts("Alice"); else puts("Bob"); } return 0; }
Codeforces 346A Alice and Bob 博弈
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。