题目
题意
给定两个数组a和b
对b中的元素x进行以下操作:将x替换成2*x或者将x替换成x/2,可进行无数次操作
问最后b是否能与a相同
思路
将a中的元素都除以2向下取整,直到为奇数或者为0,此时b中的元素只能变小,则将b中的元素除以2向下取整,如果将b中的元素都变为零了,但依旧无法与a中的数相同,则无法使a与b相等
代码
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define lowbit(x) ((x)&(-(x)))
#define int long long
#define rep(i,a,b) for(int i=(int)a,i##i=(int)b;i<=i##i;i++)
#define per(i,a,b) for(int i=(int)a,i##i=(int)b;i>=i##i;i--)
typedef long long ll;
typedef pair<int,int> PII;
typedef unsigned long long ULL;
const int N = 1000005;
const double PI = acos(-1);
void solve()
{
int n;cin>>n;
int a[n],b[n];
map<int,int>mp;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
for(int i=0;i<n;i++){
while(a[i]%2==0) a[i]/=2;
mp[a[i]]++;//记录下a[i]出现的次数
}
sort(b,b+n,greater<int>());
int flag=1;
for(int i=0;i<n;i++){
while(b[i]&&mp[b[i]]==0) b[i]/=2;
if(b[i]==0) flag=0;
else mp[b[i]]--;
}
if(!flag) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
signed main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int _ = 1;
cin>>_;
while(_--)
solve();
}