题解 CF1696C Fishingprince Plays With Array
思路
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");
}
}