题目链接
题目思路
仔细思考后就就会发现就是判断
((a[1] imes a[3] imes a[4]....a[n])\%a[2])是否等于0
我写的是先把(a[2])质因子分解,最多(30)个左右,然后让其他数对这些质因子进行分解,有点麻烦
其实可以直接对于每个(i(i!=2); a[2]=a[2]/gcd(a[2],a[i]))
最后判断(a[2])是否为(1)即可
方法1代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n;
int a[maxn];
pair<int,int> pa[maxn];
signed main(){
int _;scanf("%d",&_);
while(_--){
int tot=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
if(n==1){
printf("YES
");
continue;
}
for(ll i=2;i*i<=a[2];i++){
if(a[2]%i==0){
int cnt=0;
while(a[2]%i==0){
a[2]=a[2]/i;
cnt++;
}
pa[++tot]={i,cnt};
}
}
if(a[2]!=1){
pa[++tot]={a[2],1};
}
for(int i=1;i<=n;i++){
if(i==2) continue;
for(int j=1;j<=tot;j++){
if(a[i]==0) continue;
while(a[i]%pa[j].fi==0){
a[i]=a[i]/pa[j].fi;
pa[j].se--;
}
}
}
bool flag=1;
for(int i=1;i<=tot;i++){
if(pa[i].se>0) flag=0;
}
if(flag){
printf("YES
");
}else{
printf("NO
");
}
}
return 0;
}
方法2代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n;
int a[maxn];
signed main(){
int _;scanf("%d",&_);
while(_--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
if(i==2) continue;
a[2]=a[2]/__gcd(a[2],a[i]);
}
if(n==1||a[2]==1){
printf("YES
");
}else{
printf("NO
");
}
}
return 0;
}