题目

思路

1操作为2操作的相反操作,所以我们可以将所有的数拆解,再逐一比较 $a,b$ 数组的元素即可。

PS:因为元素之间的间隔较大,所以把拆解的数压进 $\text{vector}$ ;

PSS:数组有序,所以不要用 $\text{map}$ ;

PSSS:开 long long,否则会爆。

代码

#include<bits/stdc++.h>
using namespace std;
long long T,n,m,k,a[500005],s[500005];
pair<long long,long long> A[500005],B[500005];
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld%lld",&n,&m);
		for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
		scanf("%lld",&k);
		for(int i=1;i<=k;i++)scanf("%lld",&s[i]);
		long long Atot=0,Btot=0;
		for(int i=1;i<=n;i++)
		{
			long long cnt=1;
			while(a[i]%m==0)cnt*=m,a[i]/=m;
			if(Atot&&A[Atot].first==a[i])A[Atot].second+=cnt;
			else A[++Atot]={a[i],cnt};
		}
		for(int i=1;i<=k;i++)
		{
			long long cnt=1;
			while(s[i]%m==0)cnt*=m,s[i]/=m;
			if(Btot&&B[Btot].first==s[i])B[Btot].second+=cnt;
			else B[++Btot]={s[i],cnt};
		}
		if(Atot!=Btot){
			puts("No");continue;
		}
		int p=1;
		for(int i=1;i<=Atot;i++){
			if(A[i]!=B[i]){
				p=0;break;
			}
		}
		if(p)puts("Yes");
		else puts("No");
	}
}