由题意可以知道,数组填充颜色后一定是这样子的rbrbrbrb(红蓝相间的),而可以被d整除的涂成一种颜色,不可以的涂成另一种颜色。所以一定是只有偶数下标数组可以被d整除或只有奇数下标数组可以被d整除,所以分别求出奇数下标和偶数下标的最大公约数(最大公约数目的是为了奇数偶数下标都可以被该公约数整除的概率降到最低),交叉验证即可。
补充 欧几里得算法求最大公约数
ll gcd(ll a,ll b){
ll r=a%b;
while(r){
a=b; b=r; r=a%b;
}
return b;
}
可以作为模板
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=105;
ll a[M];
ll gcd(ll a,ll b){
ll r=a%b;
while(r){
a=b; b=r; r=a%b;
}
return b;
}
int main(){
int t; cin>>t;
while(t--){
int n; cin>>n;
ll g1=0; ll g2=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(i%2==0) g1=gcd(g1,a[i]); //偶数
else g2=gcd(g2,a[i]); //奇数
}
int f=0;
for(int i=2;i<=n;i+=2) if(a[i]%g2==0) f=1;
if(f==0) cout<<g2<<endl;
else{
for(int i=1;i<=n;i+=2) if(a[i]%g1==0)f=0;
if(f==1) cout<<g1<<endl;
else cout<<"0"<<endl;
}
}
return 0;
}