题目大意:有一个长度为n的数组,问能否构造出一个数组b使得b[i]和b[i+1]的最大公因数为a[i]
1<=n<=1e5;1<=a[i]<=1e4
思路:因为b[i]和b[i+1]的最大公因数是a[i],b[i+1]和b[i+2]的最大公因数是a[i+1],所以b[i+1]既是a[i]的倍数,也是a[i+1]的倍数,所以我们构造b数组时让b[i+1]=a[i]和a[i+1]的最小公倍数,然后检验b[i+1]和b[i+2]的最大公因数是不是a[i+1],有一处不符合就是NO
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1e5 + 5;
int a[N], b[N];
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
scanf("%d", &n);
bool temp = 1;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
if (i != 1 && temp)
{
b[i] = a[i] * a[i - 1] / gcd(a[i], a[i - 1]);//用最小公倍数构造b数组
}
if (temp && i >= 3)
{
if (gcd(b[i], b[i - 1]) != a[i - 1])
{//检验b数组的最大公因数是不是a
temp = 0;
}
}
}
if (temp)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}