#include <bits/stdc++.h> using namespace std; const int maxn=1005; const int base=10007; typedef unsigned long long ULL; set<ULL>save; int n; int a[4][maxn],b[maxn]; int id[maxn<<1]; int ave; ULL B[maxn]; int MinmumRepresentation(int *s,int n){ int i=0,j=1,k=0,t; while(i<n&&j<n&&k<n){ t=s[(i+k)>=n?i+k-n:i+k]-s[(j+k)>=n?j+k-n:j+k]; if(!t)k++; else { if(t>0)i=i+k+1; else j=j+k+1; if(i==j)++j; k=0; } } return(i<j?i:j); } ULL gethash(int *s,int n){ int pos=MinmumRepresentation(s,n); ULL res=0; for(int i=0;i<n;i++)res=res*base+s[id[pos+i]]; return res; } bool legal(int x){ return x>=2&&x<=ave-2; } bool ok(int d){ for(int j=0;j<n;j++){ b[j]=ave-a[2][j]-a[3][id[j+d]]; if(!legal(b[j]))return 0; } return save.find(gethash(b,n))!=save.end(); } int main(){ // freopen("in","r",stdin); B[0]=1; for(int i=1;i<maxn;i++)B[i]=B[i-1]*base; int t,cas=1; cin>>t; while(t--){ printf("Case %d: ",cas++); scanf("%d",&n); ULL sum=0; for(int i=0;i<4;i++) for(int j=0;j<n;j++){ scanf("%d",a[i]+j); sum+=a[i][j]; } if(sum%n){ puts("No"); continue; } ave=sum/n; save.clear(); for(int i=0;i<2*n;i++)id[i]=i%n; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ b[j]=a[0][j]+a[1][id[i+j]]; } save.insert(gethash(b,n)); } bool flag=0; for(int i=0;i<n;i++){ if(ok(i)){ flag=1; puts("Yes"); break; } } if(!flag)puts("No"); } return 0; }
时间: 2024-10-14 10:07:30