cf.div3.r760.C 代码+注释解析
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; //小心爆longlong哦,答主在这里死了三次(悲)
const int N = 110;
LL gcd(LL a, LL b) //注意longlong, gcd模板,懂得都懂,背过
{
return b ? gcd(b, a % b) : a;
}
void solve()
{
int n;
cin >> n;
LL a[N];
for(int i = 1; i <= n; i ++) scanf("%lld", &a[i]); //读入数据;
LL gcd1 = a[1], gcd2 = a[2];
for(int i = 1; i <= n; i += 2) gcd1 = gcd(gcd1, a[i]); //题目需要交替染色,说明第1357。。。位的gcd 不等于第2468。。。位的gcd,所以将他们对应的gcd分别求出来
for(int i = 2; i <= n; i += 2) gcd2 = gcd(gcd2, a[i]);
int st[N]; //代表每个数字的颜色
LL mx = max(gcd1, gcd2); ///就是挑出来第一个gcd,max函数本身无意义
for(int i = 1; i <= n; i ++)
if(a[i] % mx == 0) st[i] = 1; //染色
else st[i] = 0;
int flag = 1;
for(int i = 1; i < n; i ++)
if(st[i] == st[i + 1]) //遍历染色数组,如果有矛盾则直接跳出循环,用另一个gcd进行判断
{
flag = 0;
break;
}
if(flag)
{
printf("%lld\n", mx);
return ;
}
else //同上
{
LL mn = min(gcd1, gcd2);
for(int i = 1; i <= n; i ++)
if(a[i] % mn == 0) st[i] = 1;
else st[i] = 0;
int flag = 1;
for(int i = 1; i <= n; i ++)
if(st[i] == st[i + 1])
{
flag = 0;
break;
}
if(flag)
{
printf("%lld\n", mn);
return ;
}
else
{
puts("0"); //走到这里说明两种gcd遍历都失败了,无路可走,只可输出0
return ;
}
}
}
int main()
{
int t;
cin >> t;
while(t --)
{
solve();
}
return 0;
}