双指针,一个从前往后扫,一个从后往前扫,如果过到最后撑起来答案都是一样的,就yes否则no
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
#define int long long
using namespace std ;
int x , n , T ;
int a[500] , b[500] , vis[14000] , tot = 0 , flag = 0 ;
vector<int>v ;
signed main () {
cin >> T ;
while(T --) {
v.clear() ;
memset(vis,0,sizeof(vis)) ;
memset(b,0,sizeof(b)) ;
cin >> n ;tot = 0 ;flag = 0 ;
for(int i = 1 ; i <= 4*n ; i ++) {
cin >> a[i] ;
if(!vis[a[i]]) {
b[++tot] = a[i];
vis[a[i]] ++ ;
}else {
vis[a[i]] ++ ;
}
}
for(int i = 1 ; i <= tot ; i ++) {
if(vis[b[i]] % 2 == 1 ) {
//cout << "NO
" <<endl ;
//continue ;
flag = 1 ;
} else {
vis[b[i]] /= 2 ;
}
}
for(int i = 1 ; i <= tot ; i ++) {
for(int j = 1 ; j <= vis[b[i]] ; j ++) {
v.push_back(b[i]) ;
}
}
sort(v.begin(),v.end()) ;
int tot = v[0] * v[v.size()-1] ;int l = 0 ;
while(l < n ) {
if(v[l]*v[2*n-l-1] != tot ) {
flag = 1 ;
}
l ++ ;
}
if(!flag)
puts("YES") ;
else puts("NO") ;
}
return 0 ;
}