想法是无论如何都是原序列和他倒过来相加,所以直接枚举的
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,n,t[2001],b[2001],a[2001],k[2001],kkk=0x3f3f3f3f3f3f3f3fll,kkksc03;
int check(int);
signed main(){
for(cin>>T;T;--T){kkk=0x3f3f3f3f3f3f3f3fll;
cin>>n;
for(int i=1;i<=n;i++)
cin>>t[i];
for(int i=1;i<=n;i++){
cin>>b[i];
kkk=min(kkk,b[i]/t[i]);
}
for(int i=0;i<=kkk+1;i++){
kkksc03=0x3f3f3f3f3f3f3f3fll;
for(int j=1;j<=n;j++)
k[j]=t[j]*i,kkksc03=min(kkksc03,(b[j]-k[j])/t[n-j+1]);
int l=0,r=kkksc03+1;
while(l<r){
int mid=l+r>>1,a=check(mid);
if(a==1)
l=mid+1;
if(a==-1)
r=mid-1;
if(!a){
cout<<"yes\n";
goto g;
}
}
}
cout<<"no\n";
g:continue;
}
return 0;
}
int check(int j){
for(int i=1,jj=n;i<jj;i++,jj--){
a[i]=k[i]+j*t[jj];
a[jj]=k[jj]+j*t[i];
if(a[i]==b[i]&&a[jj]==b[jj])
continue;
if(a[i]<b[i])
return 1;
else return -1;
}
if(n&1){
int kk=n/2+1;
int kkkk=k[kk]+j*t[kk];
if(kkkk==b[kk])
return 0;
if(kkkk<b[kk])
return 1;
return -1;
}
return 0;
}