#include<bits/stdc++.h>
using namespace std;
int T,n;
int t[2005],b[2005];
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.ans","w",stdout);
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++)cin>>t[i];//输入
for(int i=1;i<=n;i++)cin>>b[i];
int o=0;//o记录在执行1之前执行2的次数
bool flag=1;//flag记录是否成立
bool flag2=0;//flag2记录是否所有数都相等
for(int i=1;i<=n/2+n%2;i++)//加上n%2是包括n为奇数时的中间的数
{
if(!flag)break;
int j=n-i+1;//对称
if(t[i]==t[j])continue;//相等的话无需考虑
if((b[j]-b[i])%(t[j]-t[i])==0)//两个b数组中的对应的数之差除以t数组中的对应的数的差就是o的值 (如果我没推错的话)
{
flag2=1;
int p=(b[j]-b[i])/(t[j]-t[i]);
if(p<0)flag=0;//当p为负时,说明本应该大小对应的两个数组不对应,则不成立
if(i==1)o=p;//直接覆盖
if(o!=p)flag=0;//如果不相等,说明一定不成立
}
else//不能整除也不成立
{
flag=0;
}
}
int m=-1;
for(int i=1;i<=n;i++)
{
if(!flag)break;
int j=n-i+1;
b[i]-=o*t[i];//将执行o次的2,直接减去
int q=t[i]+t[j];//执行过一次1的 值
if(!flag2)q=t[i]; //如果所有值都相等,由于之前没有减掉o次,所以除以二让它包括了o次
int r=0;
if(b[i]%q!=0)flag=0;//不能整除不成立
else r=b[i]/q;//因为在执行过一次1后,每次1都会让t的每个值乘二,类似于二进制,当能整除时就行
if(i==1)m=r;//m记录商的值
if(m!=r)flag=0;
}
if(flag)cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}
看在我写了这么多注释的份上能帮我调一调吗
悬一关