提交时间:2025-11-10 21:33:09

运行 ID: 38882

#include<bits/stdc++.h> using namespace std; #define int long long #define ull unsigned long long #define pb push_back #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v bool AAA; int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} namespace NTT{ const int mod=998244353,N=500010; inline int fpow(int x, int y){ int ret=1; while(y){ if(y&1) ret=1ll*ret*x%mod; x=1ll*x*x%mod; y>>=1; } return ret; } void gmodn(int &x){ x+=x>>31 & mod; } void gmod(int &x) { x%=mod; } int in,g[N]; void pre(int tl) { int l=__lg(tl)+1; int n=(1 << l); g[0]=1; g[n]=fpow(31,1 << (21-l)); for(int i=l;i;i--) g[1 << (i-1)]=1ll*g[1 << i]*g[1 << i]%mod; for(int i=0;i<n;i++) g[i]=1ll*g[i & (i-1)]*g[i & (-i)]%mod; } int init(int tl) { int l=__lg(tl)+1; in=mod-((mod-1) >> l); return l; } void ntt(int *f, int n) { int v; for(int i=(n>>1);i;i >>= 1) for(int *t=g,*j=f;j!=f+n;j+=(i << 1),t++) for(int *k=j;k!=j+i;k++){ v=1ll*(*t)*k[i]%mod; gmodn(k[i]=(*k)-v); gmodn((*k)+=v-mod); } } void intt(int *f, int n) { int v; for(int i=1;i<n;i<<=1) for(int *t=g,*j=f;j!=f+n;j+=(i << 1),t++) for(int *k=j;k!=j+i;k++){ gmodn(v=(*k)+k[i]-mod); k[i]=1ll*(*t)*(*k-k[i]+mod)%mod; *k=v; } reverse(f+1,f+n); for(int i=0;i<n;i++) f[i]=1ll*f[i]*in%mod; } int A[N],B[N],C[N]; void solve(int *s,int* f,int* g,int n,int m){ int lim=init(n+m); for(int i=0;i<(1<<lim);i++) A[i]=B[i]=0; for(int i=0;i<=n;i++) A[i]=f[i]; for(int i=0;i<=m;i++) B[i]=g[i]; ntt(A,(1<<lim)); ntt(B,(1<<lim)); for(int i=0;i<(1<<lim);i++) C[i]=1ll*A[i]*B[i]%mod; intt(C,(1<<lim)); for(int i=0;i<=n+m;i++) s[i]=C[i]; } } const int MAXN=500010,M=1010,inf=1e9,Mod=998244353,base=1011451423; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} inline void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;if(x<0)x+=Mod;} int n,k,a[MAXN],b[MAXN],sa[MAXN],sb[MAXN],c[MAXN],jc[MAXN],ny[MAXN]; ull hs[MAXN],ps[MAXN],bp[MAXN]; ull qry1(int l,int r){return l>r?0ull:hs[r]-hs[l-1]*bp[r-l+1];} ull qry2(int l,int r){return l>r?0ull:ps[r]-ps[l-1]*bp[r-l+1];} void slv(){ NTT::pre(2e5); n=read(),k=read()+1; for(int i=1;i<=n;i++)a[i+n]=a[i]=read(); for(int i=1;i<=n;i++)b[i+n]=b[i]=read(); if(k>=n){puts("0");return;} n*=2; jc[0]=ny[0]=c[0]=1; for(int i=1;i<=k;i++)jc[i]=jc[i-1]*i%Mod,ny[i]=Pow(jc[i],Mod-2); for(int i=1;i<=k;i++)c[i]=jc[k]*ny[i]%Mod*ny[k-i]%Mod*(i&1?Mod-1:1)%Mod; NTT::solve(sa,a,c,n,k+1); NTT::solve(sb,b,c,n,k+1); for(int i=1;i<=k;i++){ for(int j=n;j>=1;j--)a[j]-=a[j-1],a[j]=(a[j]%Mod+Mod)%Mod; for(int j=n;j>=1;j--)b[j]-=b[j-1],b[j]=(b[j]%Mod+Mod)%Mod; } n/=2; for(int i=1;i<=n;i++)sa[i]=sa[i+n],sb[i]=sb[i+n]; ull h=0; bp[0]=1; for(int i=1;i<=n;i++)bp[i]=bp[i-1]*base; for(int i=1;i<=n;i++)h=h*base+sa[i],hs[i]=h; h=0; for(int i=1;i<=n;i++)h=h*base+sb[i],ps[i]=h; for(int i=0;i<n;i++){ int x=(k+i)%n+1; if(x>k+1){ if(qry1(k+1,k+1+n-x)==qry2(x,n)&&qry1(k+n-x+2,n)==qry2(1,x-k-1)){ printf("%lld",i); return; } } else { if(qry1(k+1,n)==qry2(x,n-k-1+x)){ printf("%lld",i); return; } } } puts("-1"); } bool BBB; signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); // int _=read();while(_--) slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; cerr<<((&AAA)-(&BBB))/1024.0/1024<<"MB\n"; return 0; }