Codeforce346A
这是一道数学脑洞题,题目的大意就是给定n个数,每一次都从这些数中选出两个数 x,y 并将 |x−y| 添加进入集合中,问最后集合稳定时候需要多少步操作。(当然题目是用一个博弈的问题作为背景)
在给定的样例中,我们发现,其实最后只要形成
1,2,3……n
这样的一个序列最终的集合就稳定了,但是我们发现这是一种特殊的情况。
同样
2,4,6……2n
也是稳定
所以,在给定的n个数中,我们需要知道每两个数的跨度的
gcd(x,y)
从而确定最终集合稳定下来时候的元素个数.
如果
gcd=1
,最终就形成
1,2,3,4……n
这样一个序列
同样如果
gcd=2
,形成
2,4,6…………n
这样的序列
以此类推
AC代码:
#include <bits/stdc++.h>
using namespace std;
int a[105];
int gcd(int a,int b){
return b==0 ? a :gcd(b,a%b);
}
int main(){
// freopen("input.txt","r",stdin);
int n;
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
bool flag=true;
int temp=a[0];
for(int i=0;i<n-1;i++)
temp=gcd(temp,a[i+1]-a[i]);
int ans=a[n-1]/temp-n;
if(ans%2)
cout<<"Alice"<<endl;
else
cout<<"Bob"<<endl;
}
return 0;
}