using H=bool;using P=void;using Q=unsigned char;using ae=long double;using ai=unsigned;using aj=char;using aq=long long;using as=__uint128_t;using av=unsigned long long;using ax=__int128_t; #if defined(__GNUC__) && !defined(__clang__) #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #endif #define dump(...) #define CPP_DUMP_SET_OPTION(...) #define CPP_DUMP_DEFINE_EXPORT_OBJECT(...) #define CPP_DUMP_DEFINE_EXPORT_ENUM(...) #define CPP_DUMP_DEFINE_DANGEROUS_EXPORT_OBJECT(...) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include templateusing F=std::vector; #include #include #include namespace aI{namespace eN{namespace internal{templatestruct gY:std::false_type{};templatestruct gY())),decltype(std::end(std::declval()))>>:std::true_type{};templateinline constexpr H dR=gY::value;templateusing ig=decltype(*std::begin(std::declval()));templateusing ip=std::remove_cv_t>>;templatestruct gv{using type=ip;};templatestruct gv>::value_type>>{using type=typename std::remove_cv_t>::value_type;};templateusing gs=typename gv::type;templatestruct gH:std::false_type{};templatestruct gH:std::bool_constant,aj>>{};templatestruct ik:std::bool_constant,std::string>||std::is_same_v,const aj*>||std::is_same_v,aj*>||gH>::value>{};templateinline constexpr H eC=ik::value;templatestruct gC:std::false_type{};templatestruct gC().val())>>:std::true_type{};templateinline constexpr H gz=gC::value;templatestruct gu:std::false_type{};templatestruct gu()))>>:std::true_type{};templateinline constexpr H hX=gu::value;templateinline constexpr H eF=std::is_integral_v||std::is_same_v,ax>||std::is_same_v,as>;templateinline constexpr H fq=std::is_signed_v||std::is_same_v,ax>;templatestruct fn{using type=std::make_unsigned_t;};template<>struct fn{using type=as;};template<>struct fn{using type=as;};templateusing ii=typename fn>::type;}struct cP{static constexpr int bZ=1<<20;private:std::FILE*du;aj aD[bZ];int ac;int bh;int eB;H fr;H hk(){ac=0;if(fr){ssize_t cV;do{cV=::read(eB,aD,bZ);}while(cV<0&&errno==EINTR);if(cV<=0){bh=0;return false;}bh=int(cV);}else{bh=int(std::fread(aD,1,bZ,du));}return bh!=0;}templateH hV(T&w){if(!eI())return false;int c=bn();H bw=false;if(c=='-'){bw=true;c=bn();}if constexpr(internal::fq){T C=0;while('0'<=c&&c<='9'){C=bw?C*10-(c-'0'):C*10+(c-'0');c=bn();}w=C;}else{T C=0;while('0'<=c&&c<='9'){C=C*10+T(c-'0');c=bn();}w=bw?T(0)-C:C;}return true;}H im(){if(bh-ac>=64)return true;const int cb=bh-ac;if(cb>0)std::memmove(aD,aD+ac,cb);const int iM=int(std::fread(aD+cb,1,bZ-cb,du));ac=0;bh=cb+iM;if(bh=0&&::fstat(eB,&hm)==0&&!S_ISREG(hm.st_mode);}()){}cP(const cP&)=delete;cP&operator=(const cP&)=delete;int bn(){if(ac==bh&&!hk())return EOF;return aD[ac++];}H eI(){int c=bn();while(c!=EOF&&c<=' ')c=bn();if(c==EOF)return false;--ac;return true;}H read(aj&w){if(!eI())return false;w=aj(bn());return true;}H read(std::string&w){if(!eI())return false;w.clear();while(true){const int begin=ac;while(ac(aD[ac])>' '){++ac;}w.append(aD+begin,ac-begin);if(acstd::enable_if_t&&!std::is_same_v,H>&&!std::is_same_v,aj>,H>read(T&w){if(fr)return hV(w);if(!im())return false;int c=static_cast(aD[ac++]);while(c<=' ')c=static_cast(aD[ac++]);H bw=false;if(c=='-'){bw=true;c=static_cast(aD[ac++]);}if constexpr(internal::fq){T C=0;while('0'<=c&&c<='9'){const int ah=c-'0';const int ao=static_cast(aD[ac])-'0';if(0<=ao&&ao<=9){C=bw?C*100-(ah*10+ao):C*100+(ah*10+ao);++ac;}else{C=bw?C*10-ah:C*10+ah;}c=static_cast(aD[ac++]);}w=C;}else{T C=0;while('0'<=c&&c<='9'){const ai ah=ai(c-'0');const int ao=static_cast(aD[ac])-'0';if(0<=ao&&ao<=9){C=C*100+T(ah*10+ai(ao));++ac;}else{C=C*10+T(ah);}c=static_cast(aD[ac++]);}w=bw?T(0)-C:C;}if(ac>bh)ac=bh;return true;}templatestd::enable_if_t,H>read(T&w){if(!eI())return false;int c=bn();H bw=false;if(c=='-'||c=='+'){bw=c=='-';c=bn();}ae C=0;while('0'<=c&&c<='9'){C=C*10+(c-'0');c=bn();}if(c=='.'){ae hp=0.1L;c=bn();while('0'<=c&&c<='9'){C+=(c-'0')*hp;hp*=0.1L;c=bn();}}if(c=='e'||c=='E'){c=bn();H gw=false;if(c=='-'||c=='+'){gw=c=='-';c=bn();}int at=0;while('0'<=c&&c<='9'){at=at*10+(c-'0');c=bn();}ae fO=1;ae bU=10;while(at>0){if(at&1)fO*=bU;bU*=bU;at>>=1;}C=gw?C/fO:C*fO;}w=static_cast(bw?-C:C);return true;}templatestd::enable_if_t&&!internal::eF&&!internal::dR,H>read(T&w){aq x;if(!read(x))return false;if constexpr(internal::hX){if(x>=0&&uint64_t(x)H read(std::pair&w){if(!read(w.first))return false;return read(w.second);}templatestd::enable_if_t&&!internal::eC,H>read(cE&fN){using dn=internal::gs;constexpr H eR=internal::dR&&!internal::eC;for(auto&&w:fN){if constexpr(std::is_same_v&&!eR){H x;if(!read(x))return false;w=x;}else{if(!read(w))return false;}}return true;}templateH read(dx&ah,eo&ao,fP&...rest){if(!read(ah))return false;return read(ao,rest...);}templatecP&operator>>(T&w){if(!read(w))std::abort();return*this;}};struct cx{static constexpr int bZ=1<<20;private:inline static const auto gP=[]{std::arrayC{};for(int i=0;i<10000;i++){int w=i;for(int j=3;j>=0;j--){C[4*i+j]=aj('0'+w%10);w/=10;}}return C;}();std::FILE*du;aj aD[bZ];int ac;int ei;std::chars_format eE;aj fj;public:explicit cx(std::FILE*eT=stdout):du(eT),ac(0),ei(6),eE(std::chars_format::general),fj(' '){}cx(const cx&)=delete;cx&operator=(const cx&)=delete;~cx(){eU();}P eU(){if(ac!=0){std::fwrite(aD,1,ac,du);ac=0;}std::fflush(du);}P ca(aj c){if(ac==bZ)eU();aD[ac++]=c;}P bk(const aj*s){while(*s!='\0')ca(*s++);}P bk(const std::string&s){std::size_t cd=0;while(cd(bZ-ac,s.size()-cd);std::memcpy(aD+ac,s.data()+cd,fE);ac+=int(fE);cd+=fE;}}P bk(aj c){ca(c);}P bk(H w){ca(w?'1':'0');}templatestd::enable_if_t>bk(T w){aj dU[128];auto[end,iO]=std::to_chars(dU,dU+sizeof(dU),w,eE,ei);if(iO!=std::errc())std::abort();for(const aj*fD=dU;fD!=end;fD++){ca(*fD);}}templatestd::enable_if_t&&!std::is_same_v,H>&&!std::is_same_v,aj> >bk(T w){using hu=std::remove_cv_t;using el=internal::ii;el bI;if constexpr(internal::fq){if(w<0){ca('-');bI=el(0)-el(w);}else{bI=el(w);}}else{bI=w;}if(bI==0){ca('0');return;}ai hh[16];int aV=0;while(bI>=10000){const el em=bI/10000;hh[aV++]=ai(bI-em*10000);bI=em;}if(ac>bZ-64)eU();const ai eP=ai(bI);const aj*ah=gP.data()+4*eP;int fW=eP<10?3:eP<100?2:eP<1000?1:0;for(;fW<4;fW++)aD[ac++]=ah[fW];while(aV--){const aj*dU=gP.data()+4*hh[aV];std::memcpy(aD+ac,dU,4);ac+=4;}}templatestd::enable_if_t&&!internal::eF&&!internal::dR >bk(const T&w){bk(w.val());}templateP bk(const std::pair&w){bk(w.first);ca(' ');bk(w.second);}templatestd::enable_if_t&&!internal::eC >bk(const cE&fN){using dn=internal::gs;constexpr H eR=internal::dR&&!internal::eC;H ah=true;for(const auto&w:fN){if(!ah)ca(eR?'\n':fj);ah=false;if constexpr(std::is_same_v&&!eR){bk(static_cast(w));}else{bk(w);}}}templateP fL(const dx&ah,const fP&...rest){bk(ah);((ca(' '),bk(rest)),...);}P println(){ca('\n');}P jl(int ek){ei=ek;}P jo(int ek=6){eE=std::chars_format::fixed;ei=ek;}P jm(int ek=6){eE=std::chars_format::general;ei=ek;}P jj(aj iF){fj=iF;}templateP println(const Args&...args){fL(args...);ca('\n');}templatecx&operator<<(const T&w){bk(w);return*this;}};}}using namespace std;namespace aI{namespace cm{inline eN::cP&ho(){static eN::cP fy;return fy;}inline eN::cx&cW(){static eN::cx fy;return fy;}}}using ll=aq;using K=unsigned int;using bV=av;using fS=__int128;using jH=unsigned __int128; #ifdef __SIZEOF_FLOAT128__ using jG=__float128; #endif templateconstexpr T bj=0;template<>constexpr int bj =1'000'000'000;template<>constexpr ll bj =ll(bj)*bj*2;template<>constexpr K bj =bj;template<>constexpr bV bj =bj;template<>constexpr fS bj =fS(bj)*bj;template<>constexpr double bj =bj;template<>constexpr ae bj =bj;using pi=pair;using pl=pair;using vi=vector;using vl=vector;templateusing vc=vector;templateusing ge=vector>;using jO=ge;using jP=ge;templateusing iS=vector>;templateusing iR=vector>;templateusing jz=vector>;templateusing jN=std::priority_queue,greater>;templateusing jI=unordered_map; #define vv(type, name, h, ...) vector> name(h, vector(__VA_ARGS__)) #define vvv(type, name, h, w, ...) vector>> name(h, vector>(w, vector(__VA_ARGS__))) #define vvvv(type, name, a, b, c, ...) vector>>> name( a, vector>>(b, vector>(c, vector(__VA_ARGS__)))) #define overload4(a, b, c, d, e, ...) e #define overload3(a, b, c, d, ...) d #define FOR1(a) for (ll _ = 0; _ < (ll)a; ++_) #define FOR2(i, a) for (ll i = 0; i < (ll)a; ++i) #define FOR3(i, a, b) for (ll i = a; i < (ll)b; ++i) #define FOR4(i, a, b, c) for (ll i = a; i < (ll)b; i += (c)) #define FOR1_R(a) for (ll i = (a) - 1; i >= 0; --i) #define FOR2_R(i, a) for (ll i = (a) - 1; i >= 0; --i) #define FOR3_R(i, a, b) for (ll i = (b) - 1; i >= (ll)a; --i) #define FOR(...) overload4(__VA_ARGS__, FOR4, FOR3, FOR2, FOR1)(__VA_ARGS__) #define FOR_R(...) overload3(__VA_ARGS__, FOR3_R, FOR2_R, FOR1_R)(__VA_ARGS__) #define FORI1(a) for (int _ = 0; _ < (int)a; ++_) #define FORI2(i, a) for (int i = 0; i < (int)a; ++i) #define FORI3(i, a, b) for (int i = a; i < (int)b; ++i) #define FORI4(i, a, b, c) for (int i = a; i < (int)b; i += (c)) #define FORI1_R(a) for (int i = (a) - 1; i >= 0; --i) #define FORI2_R(i, a) for (int i = (a) - 1; i >= 0; --i) #define FORI3_R(i, a, b) for (int i = (b) - 1; i >= (int)a; --i) #define FORI(...) overload4(__VA_ARGS__, FORI4, FORI3, FORI2, FORI1)(__VA_ARGS__) #define FORI_R(...) overload3(__VA_ARGS__, FORI3_R, FORI2_R, FORI1_R)(__VA_ARGS__) #define FOR_subset(t, s) for (int t = (s); t >= 0; t = (t == 0 ? -1 : (t - 1) & (s))) #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() int fH(int x){return __builtin_popcount(x);}int fH(K x){return __builtin_popcount(x);}int fH(ll x){return __builtin_popcountll(x);}int fH(bV x){return __builtin_popcountll(x);}int fp(int x){return __builtin_parity(x);}int fp(K x){return __builtin_parity(x);}int fp(ll x){return __builtin_parityll(x);}int fp(bV x){return __builtin_parityll(x);}int fI(int x){return(x==0?-1:31-__builtin_clz(x));}int fI(K x){return(x==0?-1:31-__builtin_clz(x));}int fI(ll x){return(x==0?-1:63-__builtin_clzll(x));}int fI(bV x){return(x==0?-1:63-__builtin_clzll(x));}int fG(int x){return(x==0?-1:__builtin_ctz(x));}int fG(K x){return(x==0?-1:__builtin_ctz(x));}int fG(ll x){return(x==0?-1:__builtin_ctzll(x));}int fG(bV x){return(x==0?-1:__builtin_ctzll(x));}templateT fK(T a,T b){return a/b-(a%b&&(a^b)<0);}templateT jE(T x,T y){return fK(x+y-1,y);}templateT jD(T x,T y){return x-y*fK(x,y);}templatepairjw(T x,T y){T q=fK(x,y);return{q,x-q*y};}templateT jJ(U x_,int n){T x=x_;T hD=1;while(n>0){if(n&1)hD*=x;x*=x;n>>=1;}return hD;}templateT jK(const vector&A){T sm=0;for(auto&&a:A)sm+=a;return sm;} #define LB(c, x) distance((c).begin(), lower_bound(all(c), (x))) #define UB(c, x) distance((c).begin(), upper_bound(all(c), (x))) #define UNIQUE(x) sort(all(x)), x.erase(unique(all(x)), x.end()), x.shrink_to_fit() templateinline H jC(T&a,const S&b){return(ainline H iN(T&a,const S&b){return(a>b?a=b,1:0);}vcjt(const string&S,aj iz){vcA(S.size());FOR(i,S.size()){A[i]=(S[i]!='?'?S[i]-iz:-1);}return A;}templatevectorjv(vector&A,int iX=1){int N=A.size();vectorB(N+1);FOR(i,N){B[i+1]=B[i]+A[i];}if(iX==0)B.erase(B.begin());return B;}templatevectorjq(const vector&A){vectorfY(A.size());iota(all(fY),0);sort(all(fY),[&](int i,int j){return(A[i]==A[j]?ivcjn(const vc&A,const vc&I){vcB(I.size());FOR(i,I.size())B[i]=A[I[i]];return B;}templateconstexpr auto iV(T...a){return iV(initializer_list>{a...});}templateconstexpr auto iU(T...a){return iU(initializer_list>{a...});}templateH fV(Ts&...aB){return aI::cm::ho().read(aB...);}templateP fL(const Ts&...aB){aI::cm::cW().println(aB...);}P jA(H b){aI::cm::cW().println(b?"YES":"NO");}P jB(H b){aI::cm::cW().println(b?"Yes":"No");}P jL(){aI::cm::cW().println("YES");}P NO(){aI::cm::cW().println("NO");}P jM(){aI::cm::cW().println("Yes");}P No(){aI::cm::cW().println("No");}auto&jx=aI::cm::ho();auto&jr=aI::cm::cW();namespace aI{namespace ch{templatestruct R{static_assert(0,int> =0>constexpr R(dt v)noexcept{if constexpr(std::is_signed_v
){int64_t x=static_cast(v)%static_cast(bg);if(x<0)x+=bg;J=static_cast(x);}else{J=static_cast(static_cast(v)%bg);}}constexpr uint32_t val()const noexcept{return J;}constexpr R&operator++()noexcept{J++;if(J==bg)J=0;return*this;}constexpr R&operator--()noexcept{if(J==0)J=bg;J--;return*this;}constexpr R operator++(int)noexcept{R eb=*this;++*this;return eb;}constexpr R operator--(int)noexcept{R eb=*this;--*this;return eb;}constexpr R&operator+=(const R&O)noexcept{J+=O.J;if(J>=bg)J-=bg;return*this;}constexpr R&operator-=(const R&O)noexcept{J-=O.J;if(J>=bg)J+=bg;return*this;}constexpr R&operator*=(const R&O)noexcept{uint64_t z=J;z*=O.J;J=static_cast(z%bg);return*this;}constexpr R&operator/=(const R&O)noexcept{return*this*=O.inv();}constexpr R operator+(const R&O)const noexcept{return R(*this)+=O;}constexpr R operator-(const R&O)const noexcept{return R(*this)-=O;}constexpr R operator*(const R&O)const noexcept{return R(*this)*=O;}constexpr R operator/(const R&O)const noexcept{return R(*this)/=O;}constexpr H operator==(const R&O)const noexcept{return J==O.J;}constexpr H operator!=(const R&O)const noexcept{return J!=O.J;}constexpr R pow(aq n)const noexcept{R eb=ct(1%bg);R x=n<0?inv():*this;uint64_t at=n<0?uint64_t(-(n+1))+1:uint64_t(n);while(at>0){if(at&1)eb*=x;x*=x;at>>=1;}return eb;}constexpr R inv()const noexcept{int64_t a=J,b=bg,u=1,v=0;while(b){int64_t t=a/b;a-=t*b;std::swap(a,b);u-=t*v;std::swap(u,v);}assert(a==1);u%=bg;if(u<0)u+=bg;return ct(static_cast(u));}friend std::ostream&operator<<(std::ostream&os,const R&O){return os<>(std::istream&is,R&O){aq v;is>>v;O=R(v);return is;}};using ij=R<998244353>;using jk=R<1000000007>;templatestruct ag{private:uint32_t J;inline static uint32_t ba=1;public:static uint32_t o()noexcept{return ba;}static P ju(uint32_t cC)noexcept{assert(cC>0);assert(cC<=uint32_t(1)<<31);ba=cC;}static ag ct(uint32_t v)noexcept{assert(v,int> =0>ag(dt v)noexcept{if constexpr(std::is_signed_v
){int64_t x=static_cast(v)%static_cast(ba);if(x<0)x+=ba;J=static_cast(x);}else{J=static_cast(static_cast(v)%ba);}}uint32_t val()const noexcept{return J;}ag&operator++()noexcept{J++;if(J==ba)J=0;return*this;}ag&operator--()noexcept{if(J==0)J=ba;J--;return*this;}ag operator++(int)noexcept{ag C=*this;++*this;return C;}ag operator--(int)noexcept{ag C=*this;--*this;return C;}ag&operator+=(const ag&O)noexcept{J+=O.J;if(J>=ba)J-=ba;return*this;}ag&operator-=(const ag&O)noexcept{J-=O.J;if(J>=ba)J+=ba;return*this;}ag&operator*=(const ag&O)noexcept{J=static_cast(uint64_t(J)*O.J%ba);return*this;}ag&operator/=(const ag&O)noexcept{return*this*=O.inv();}ag operator+(const ag&O)const noexcept{return ag(*this)+=O;}ag operator-(const ag&O)const noexcept{return ag(*this)-=O;}ag operator*(const ag&O)const noexcept{return ag(*this)*=O;}ag operator/(const ag&O)const noexcept{return ag(*this)/=O;}H operator==(const ag&O)const noexcept{return J==O.J;}H operator!=(const ag&O)const noexcept{return J!=O.J;}ag pow(aq at)const noexcept{ag C=ct(1%ba);ag aW=at<0?inv():*this;uint64_t bI=at<0?uint64_t(-(at+1))+1:uint64_t(at);while(bI>0){if(bI&1)C*=aW;aW*=aW;bI>>=1;}return C;}ag inv()const noexcept{int64_t a=J,b=ba,u=1,v=0;while(b){int64_t em=a/b;a-=em*b;std::swap(a,b);u-=em*v;std::swap(u,v);}assert(a==1);u%=ba;if(u<0)u+=ba;return ct(static_cast(u));}friend std::ostream&operator<<(std::ostream&os,const ag&O){return os<>(std::istream&is,ag&O){aq w;is>>w;O=ag(w);return is;}};}} #if defined(__GNUC__) && !defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) #include #define M1UNE_FPS_HAS_X86_SIMD 1 #pragma GCC push_options #pragma GCC target("avx2,bmi") #endif #ifdef M1UNE_FPS_HAS_X86_SIMD #include #include #include #include namespace aI{namespace dD{namespace internal{namespace cy{using K=ai;using bV=av;using ap=std::size_t;using D=__m256i;inline P af(P*p,D x){_mm256_store_si256((D*)p,x);}inline D W(const P*p){return _mm256_load_si256((const D*)p);}constexpr K dY(K x,K M){return std::min(x,x-M);}constexpr K jF(K x,K M){return std::min(x,x+M);}constexpr K dV(bV x,K E,K M){return(x+bV(K(x)*E)*M)>>32;}constexpr K bN(K x,K y,K E,K M){return dV(bV(x)*y,E,M);}constexpr K aJ(K x,K y,K E,K M){return dY(dV(bV(x)*y,E,M),M);}constexpr K gc(K a,K b,K E,K M,K r){for(;b;b>>=1,a=bN(a,a,E,M)){if(b&1){r=bN(r,a,E,M);}}return r;}constexpr K hr(K a,K b,K E,K M,K r){return dY(gc(a,b,E,M,r),M);}inline D aN(D x,D M){return _mm256_min_epu32(x,_mm256_sub_epi32(x,M));}inline D iK(D x,D M){return _mm256_min_epu32(x,_mm256_add_epi32(x,M));}inline D ce(D x,D y,D){return _mm256_add_epi32(x,y);}inline D bi(D x,D y,D M){return _mm256_add_epi32(_mm256_sub_epi32(x,y),M);}inline D aH(D x,D y,D M){return aN(_mm256_add_epi32(x,y),M);}inline D by(D x,D y,D M){return iK(_mm256_sub_epi32(x,y),M);}templateinline D js(D x,D M){return _mm256_blend_epi32(x,_mm256_sub_epi32(M,x),iW);}inline D dV(D a,D b,D E,D M){D c=_mm256_mul_epu32(a,E),d=_mm256_mul_epu32(b,E);c=_mm256_mul_epu32(c,M),d=_mm256_mul_epu32(d,M);return _mm256_blend_epi32(_mm256_srli_epi64(_mm256_add_epi64(a,c),32),_mm256_add_epi64(b,d),0xaa);}inline D bN(D a,D b,D E,D M){return dV(_mm256_mul_epu32(a,b),_mm256_mul_epu32(_mm256_srli_epi64(a,32),_mm256_srli_epi64(b,32)),E,M);}inline D aJ(D a,D b,D E,D M){return aN(bN(a,b,E,M),M);}inline D cT(D a,D b,D E,D M){return dV(_mm256_mul_epu32(a,b),_mm256_mul_epu32(_mm256_srli_epi64(a,32),b),E,M);}inline D bH(D a,D b,D ep,D M){D cc=_mm256_mul_epu32(a,ep),dd=_mm256_mul_epu32(_mm256_srli_epi64(a,32),ep);D c=_mm256_mul_epu32(a,b),d=_mm256_mul_epu32(_mm256_srli_epi64(a,32),b);cc=_mm256_mul_epu32(cc,M),dd=_mm256_mul_epu32(dd,M);return _mm256_blend_epi32(_mm256_srli_epi64(_mm256_add_epi64(c,cc),32),_mm256_add_epi64(d,dd),0xaa);}inline D jp(D a,D b,D ep,D M){D cc=_mm256_mul_epu32(a,ep),dd=_mm256_mul_epu32(_mm256_srli_epi64(a,32),_mm256_srli_epi64(ep,32));D c=_mm256_mul_epu32(a,b),d=_mm256_mul_epu32(_mm256_srli_epi64(a,32),_mm256_srli_epi64(b,32));cc=_mm256_mul_epu32(cc,M),dd=_mm256_mul_epu32(dd,M);return _mm256_blend_epi32(_mm256_srli_epi64(_mm256_add_epi64(c,cc),32),_mm256_add_epi64(d,dd),0xaa);}inline D eK(D a,D bu,D M){D cc=_mm256_mul_epu32(a,bu),c=_mm256_mul_epu32(a,_mm256_srli_epi64(bu,32));cc=_mm256_mul_epu32(cc,M);return aN(_mm256_srli_epi64(_mm256_add_epi64(c,cc),32),M);}constexpr auto bT=26,dq=6;constexpr auto cX=ap(1)<eX[bT-2],eW[bT-2],fR,fX,fQ,et[bT-3],hl[bT-3],er[bT-3],hd[bT-3],ga,gb,hi,hj,fT,hb,fU,hc;constexpr dm(const K m):o(m),cq(m*2),E([&]{K n=2+m;for(int i=0;i<4;++i){n*=2+m*n;}return n;}()),am((-m)%m),r2((-bV(m))%m),r3(aJ(r2,r2,E,m)),cs{},eQ{},dC{},eX{},eW{},fR{},fX{},fQ{},et{},hl{},er{},hd{},ga{},gb{},hi{},hj{},fT{},hb{},fU{},hc{}{const int k=__builtin_ctz(m-1);K _g=bN(3,r2,E,o);for(;;++_g){if(hr(_g,o>>1,E,o,am)!=am){break;}}_g=gc(_g,o>>k,E,o,am);K bq[bT-1],bl[bT-1];bq[k-2]=_g,bl[k-2]=gc(_g,o-2,E,o,am);for(int i=k-2;i>0;--i){bq[i-1]=bN(bq[i],bq[i],E,o);bl[i-1]=bN(bl[i],bl[i],E,o);}dC[k-1]=hr(_g,3,E,o,am);for(int i=k-1;i>0;--i){dC[i-1]=aJ(dC[i],dC[i],E,o);}cs=bq[0],eQ=cs*E;fR={am,0,am,0,am};fX={bq[1],0,bq[0],0,o-aJ(bq[0],bq[1],E,o)};fQ={bl[1],0,bl[0],0,aJ(bl[0],bl[1],E,o)};K pr=am,dE=am;for(int i=0;ibp[bT>>1];const D ad=_mm256_set1_epi32(al->o),G=_mm256_set1_epi32(al->cq),bc=_mm256_set1_epi32(al->E);const D dc=_mm256_set1_epi32(al->cs),cU=_mm256_set1_epi32(al->eQ),id=_mm256_setr_epi32(0,2,0,4,0,2,0,4);const int dZ=__builtin_ctzll(n);std::fill(bp,bp+(dZ>>1),al->fX);const ap nn=n>>(dZ&1),m=std::min(n,cX),mm=std::min(nn,cX);if(nn!=n){for(ap i=0;i>2;L>0;L>>=2){for(ap i=0;i>1;for(ap L=(ap(1)<>2;L>=cX;L>>=2,t-=2,--p){auto rt=W(bp+p);const auto r1=_mm256_permutevar8x32_epi32(rt,id);const auto dz=_mm256_permutevar8x32_epi32(_mm256_mul_epu32(rt,bc),id);rt=eK(rt,W(al->eX+__builtin_ctzll(~j>>t)),ad);const auto r2=_mm256_shuffle_epi32(r1,_MM_PERM_BBBB),fZ=_mm256_shuffle_epi32(r1,_MM_PERM_DDDD);const auto fM=_mm256_shuffle_epi32(dz,_MM_PERM_BBBB),iL=_mm256_shuffle_epi32(dz,_MM_PERM_DDDD);af(bp+p,rt);for(ap i=0;i>2;L;l=L,L>>=2,t-=2,--p){auto rt=W(bp+p);for(ap i=(j==0?l:0),k=(j+i)>>t;ieX+__builtin_ctzll(~k)),ad);}af(bp+p,rt);}}}templateinline P gT(D*const f,ap n,const dm*const al){alignas(32)std::arraybp[bT>>1];const D ad=_mm256_set1_epi32(al->o),G=_mm256_set1_epi32(al->cq),bc=_mm256_set1_epi32(al->E);const D dc=_mm256_set1_epi32(al->cs),cU=_mm256_set1_epi32(al->eQ),id=_mm256_setr_epi32(0,2,0,4,0,2,0,4);const int dZ=__builtin_ctzll(n);std::fill(bp,bp+(dq>>1),al->fR);std::fill(bp+(dq>>1),bp+(bT>>1),al->fQ);const ap nn=n>>(dZ&1),mm=std::min(nn,cX);for(ap j=0;j>t;ieW+__builtin_ctzll(~k)),ad);}af(bp+p,rt);}int tt=std::min(__builtin_ctzll(~(j>>dq))+dq,dZ);for(ap L=cX,l=L<<2;t<=tt;L=l,l<<=2,t+=2,++p){if((j+cX)==l){if(dY&&l==n){for(ap i=0;ieW+__builtin_ctzll(~j>>t)),ad);const auto r2=_mm256_shuffle_epi32(r1,_MM_PERM_BBBB),r3=_mm256_shuffle_epi32(r1,_MM_PERM_DDDD);const auto fM=_mm256_shuffle_epi32(dz,_MM_PERM_BBBB),iP=_mm256_shuffle_epi32(dz,_MM_PERM_DDDD);af(bp+p,rt);for(ap i=0;iam;const auto o=al->o,E=al->E;const auto Fx=_mm256_set1_epi32(aJ((o-((o-1)>>(__builtin_ctzll(lm)))),al->r3,E,o));const auto bc=_mm256_set1_epi32(E),ad=_mm256_set1_epi32(o),G=_mm256_set1_epi32(al->cq);for(ap i=0;idC[__builtin_ctzll(~i)],E,o);}}inline P hR(D*const C,const D*const f,const D*const g,ap lm,const dm*const al){K RR=al->am;const auto o=al->o,E=al->E;const auto Fx=_mm256_set1_epi32(aJ((o-((o-1)>>(__builtin_ctzll(lm)))),al->r3,E,o));const auto bc=_mm256_set1_epi32(E),ad=_mm256_set1_epi32(o),G=_mm256_set1_epi32(al->cq);for(ap i=0;idC[__builtin_ctzll(~i)],E,o);}}}}}} #endif #ifdef M1UNE_FPS_HAS_X86_SIMD #pragma GCC pop_options #endif namespace aI{namespace dD{namespace internal{templatestruct fi:std::false_type{};templatestruct fi{})>>:std::true_type{};constexpr uint32_t hU(uint32_t o){if(o==2)return 1;if(o==167772161)return 3;if(o==469762049)return 3;if(o==754974721)return 11;if(o==998244353)return 3;if(o==1224736769)return 3;uint32_t eO[32]={};int aV=0;uint32_t x=o-1;for(uint32_t p=2;uint64_t(p)*p<=x;p++){if(x%p!=0)continue;eO[aV++]=p;while(x%p==0)x/=p;}if(x>1)eO[aV++]=x;for(uint32_t g=2;;g++){H ok=true;for(int i=0;i0){if(at&1)w=w*aW%o;aW=aW*aW%o;at>>=1;}if(w==1){ok=false;break;}}if(ok)return g;}}constexpr int gE(uint32_t x){int C=0;while((x&1)==0){x>>=1;C++;}return C;}templatestruct fw{static constexpr int cA=gE(e::o()-1);std::arraycr;std::arraycM;std::arrayht;std::arraygJ;std::arraygS;std::arraygt;fw(){constexpr uint32_t fl=hU(e::o());for(int bx=1;bx<=cA;bx++){cr[bx]=e(fl).pow((e::o()-1)>>bx);cM[bx]=cr[bx].inv();}e bK=1;e ee=1;for(int i=0;i+1const fw&iE(){static const fwdb;return db;}templateP dg(F&a,H iJ,H iD=true){const int n=int(a.size());assert(n>0&&(n&(n-1))==0);assert((e::o()-1)%uint32_t(n)==0);const auto&db=iE();const int cf=gE(uint32_t(n));if(!iJ){int au=0;while(au0){if(au==1){const int aC=1<<(cf-au);e aZ=1;for(int V=0;V<(1<<(au-1));V++){const int ab=V<<(cf-au+1);for(int i=0;i__attribute__((target("avx2,bmi"),hot))FhS(const F&a,const F&b){const int bf=int(a.size()+b.size()-1);int n=1;while(n(::operator new[](sizeof(uint32_t)*n,std::align_val_t(32)));auto*cl=cS?bG:static_cast(::operator new[](sizeof(uint32_t)*n,std::align_val_t(32)));if constexpr(std::is_same_v>){static_assert(sizeof(e)==sizeof(uint32_t)&&std::is_trivially_copyable_v);std::memcpy(bG,a.data(),sizeof(uint32_t)*a.size());if(!cS)std::memcpy(cl,b.data(),sizeof(uint32_t)*b.size());}else{for(int i=0;i>3;cy::fv(reinterpret_cast<__m256i*>(bG),cN,&cQ);if(!cS)cy::fv(reinterpret_cast<__m256i*>(cl),cN,&cQ);cy::hT(reinterpret_cast<__m256i*>(bG),reinterpret_cast(cl),cN,&cQ);cy::gT(reinterpret_cast<__m256i*>(bG),cN,&cQ);FC(bf);for(int j=0;jFib(const F&a,const F&b){if(a.empty()||b.empty())return{};FC(a.size()+b.size()-1);if(a.size()FgA(const F&a,const F&b){const int bf=int(a.size()+b.size()-1);int n=1;while(n=64&&__builtin_cpu_supports("avx2"))return internal::hS(a,b);} #endif const H cS=&a==&b;Ffa(n);std::copy(a.begin(),a.end(),fa.begin());internal::dg(fa,false);const e eM=e(n).inv();if(cS){for(int i=0;ifb(n);std::copy(b.begin(),b.end(),fb.begin());internal::dg(fb,false);for(int i=0;iFhO(const F&a,const F&b,int an){assert(e::o()==998244353);assert(an>=2&&(an&(an-1))==0);assert((e::o()-1)%uint32_t(an)==0);const int bo=an/2;const int dr=int((a.size()+bo-1)/bo);const int ds=int((b.size()+bo-1)/bo);auto ed=[&](const F&aB,int eh){F>dw;dw.reserve(eh);for(int V=0;Vcw(an);std::copy_n(aB.begin()+begin,aV,cw.begin());dg(cw,false);dw.emplace_back(std::move(cw));}return dw;};F>bG=ed(a,dr);F>cl=ed(b,ds);const int bf=int(a.size()+b.size()-1);FC(bf);Fbv(an);for(int bJ=0;bJ(::operator new[](sizeof(uint32_t)*ci,std::align_val_t(32)))){}bm(const bm&)=delete;bm&operator=(const bm&)=delete;bm(bm&&dX)noexcept:cg(dX.cg){dX.cg=nullptr;}bm&operator=(bm&&dX)noexcept{if(this==&dX)return*this;::operator delete[](cg,std::align_val_t(32));cg=dX.cg;dX.cg=nullptr;return*this;}~bm(){::operator delete[](cg,std::align_val_t(32));}uint32_t*data(){return cg;}const uint32_t*data()const{return cg;}};template__attribute__((target("avx2,bmi"),hot))FhP(const F&a,const F&b,int an){assert(e::o()==998244353);assert(an>=64&&(an&(an-1))==0);assert((e::o()-1)%uint32_t(an)==0);const int bo=an/2;const int dr=int((a.size()+bo-1)/bo);const int ds=int((b.size()+bo-1)/bo);static constexpr cy::dm cQ(998244353);const std::size_t cN=std::size_t(an)/8;auto ed=[&](const F&aB,int eh){Fdw;dw.reserve(eh);for(int V=0;V>){static_assert(sizeof(e)==sizeof(uint32_t)&&std::is_trivially_copyable_v);std::memcpy(cw.data(),aB.data()+begin,sizeof(uint32_t)*aV);}else{for(int i=0;i(cw.data()),cN,&cQ);dw.emplace_back(std::move(cw));}return dw;};FbG=ed(a,dr);Fcl=ed(b,ds);const int bf=int(a.size()+b.size()-1);FC(bf);bm bv(an);for(int bJ=0;bJ(bv.data()),reinterpret_cast(bG[cB].data()),reinterpret_cast(cl[fB].data()),cN,&cQ);}cy::gT(reinterpret_cast<__m256i*>(bv.data()),cN,&cQ);const int dQ=bJ*bo;const int fo=std::min(an,bf-dQ);for(int i=0;i=e::o())w-=e::o();C[dQ+i]=e::ct(w);}}return C;} #endif templateFhQ(const F&a,const F&b,int an=1<<23){ #ifdef M1UNE_FPS_HAS_X86_SIMD if(an>=64&&__builtin_cpu_supports("avx2"))return hP(a,b,an); #endif return hO(a,b,an);}}templateFgO(const F&a,const F&b){if(a.empty()||b.empty())return{};if(std::min(a.size(),b.size())<=32)return ib(a,b);const int bf=int(a.size()+b.size()-1);int n=1;while(n::value){if constexpr(e::o()==998244353){if(n>(1<<23))return internal::hQ(a,b);}if((e::o()-1)%uint32_t(n)==0)return gA(a,b);}using dW=ch::R<167772161>;using cn=ch::R<469762049>;using bL=ch::R<754974721>;assert(n<=(1<<24));[[maybe_unused]]const unsigned __int128 ia=static_cast(std::min(a.size(),b.size()))*(e::o()-1)*(e::o()-1);[[maybe_unused]]const unsigned __int128 iv=static_cast(dW::o())*cn::o()*bL::o();assert(ia(){FgM(a.size());FgN(b.size());for(int i=0;ic1=fd.template operator()();Fc2=fd.template operator()();Fc3=fd.template operator()();static const uint64_t ie=cn(dW::o()).inv().val();static const uint64_t gW=dW::o()%bL::o();static const uint64_t il=gW*(cn::o()%bL::o())%bL::o();static const uint64_t hW=bL(uint32_t(il)).inv().val();const uint64_t cO=e::o();const uint64_t gQ=dW::o()%cO;const uint64_t ih=gQ*(cn::o()%cO)%cO;FC(bf);for(int i=0;i(static_cast(a)*b%o);}inline uint64_t gX(uint64_t aW,uint64_t at,uint64_t o){uint64_t C=1;while(at>0){if(at&1)C=eg(C,aW,o);aW=eg(aW,aW,o);at>>=1;}return C;}inline uint64_t gD(){static uint64_t hs=0x123456789abcdef0ULL;hs+=0x9e3779b97f4a7c15ULL;uint64_t w=hs;w=(w^(w>>30))*0xbf58476d1ce4e5b9ULL;w=(w^(w>>27))*0x94d049bb133111ebULL;return w^(w>>31);}}inline H iH(uint64_t w){if(w<2)return false;for(uint64_t da:{2ULL,3ULL,5ULL,7ULL,11ULL,13ULL,17ULL,19ULL,23ULL,29ULL,31ULL,37ULL}){if(w%da==0)return w==da;}uint64_t cR=w-1;int gK=0;while((cR&1)==0){cR>>=1;gK++;}for(uint64_t aW:{2ULL,325ULL,9375ULL,28178ULL,450775ULL,9780504ULL,1795265022ULL}){if(aW%w==0)continue;uint64_t x=internal::gX(aW%w,cR,w);if(x==1||x==w-1)continue;H gU=true;for(int i=1;i((static_cast(eg(gZ,gZ,w))+iG)%w);};while(df==1){x=y;for(uint64_t i=0;i(128,eD-ab);for(uint64_t i=0;iy?x-y:y-x;bK=eg(bK,ft,w);}df=std::gcd(bK,w);}eD<<=1;}if(df==w){do{dT=fA(dT);const uint64_t ft=x>dT?x-dT:dT-x;df=std::gcd(ft,w);}while(df==1);}if(df!=w)return df;}}inline P fh(uint64_t w,F&dv){if(w==1)return;if(iH(w)){dv.push_back(w);return;}const uint64_t ha=iy(w);fh(ha,dv);fh(w/ha,dv);}}inline Fio(uint64_t w){assert(w>=1);FC;internal::fh(w,C);std::sort(C.begin(),C.end());return C;}inline F>ef(uint64_t w){Fdv=io(w);F>C;for(uint64_t da:dv){if(C.empty()||C.back().first!=da){C.emplace_back(da,1);}else{C.back().second++;}}return C;}inline FeO(uint64_t w){FC={1};for(const auto&cD:ef(w)){const int iq=int(C.size());uint64_t bU=1;for(int at=1;at<=cD.second;at++){bU*=cD.first;for(int i=0;i=1);uint64_t C=w;for(const auto&cD:ef(w)){C=C/cD.first*(cD.first-1);}return C;}inline int jy(uint64_t w){assert(w>=1);int C=1;for(const auto&cD:ef(w)){if(cD.second>=2)return 0;C=-C;}return C;}}}namespace aI{namespace ch{inline H hZ(uint64_t o){if(o==2||o==4)return true;if(o<2)return false;uint64_t cR=o;if((cR&1)==0){cR>>=1;if((cR&1)==0)return false;}return ef(cR).size()==1;}inline uint64_t fl(uint64_t o){assert(o>=2);if(o==2)return 1;if(!hZ(o))return 0;const uint64_t hB=iB(o);const F>dv=ef(hB);for(uint64_t ej=2;ejstruct bt{using dp=T;static constexpr int cY=0;};templatestruct bt>{using dp=typename bt::dp;static constexpr int cY=bt::cY+1;};templateP fg(const ak&aB,F&aP){if constexpr(bt::cY>0){assert(!aB.empty());assert(aB.size()<=std::size_t(std::numeric_limits::max()));aP.push_back(int(aB.size()));fg(aB.front(),aP);}}templateP fe(const ak&aB,const F&aP,int bx,F&cz){if constexpr(bt::cY==0){cz.push_back(aB);}else{assert(bxP gq(ak&aB,const F&aP,int bx,const F&cz,int&cd){if constexpr(bt::cY==0){assert(cdFgo(const ak&ah,const ak&ao,F::dp>&dl,F::dp>&dk){FaP;fg(ah,aP);assert(int(aP.size())==bt::cY);FgL;fg(ao,gL);assert(gL==aP);fe(ah,aP,0,dl);fe(ao,aP,0,dk);std::reverse(aP.begin(),aP.end());return aP;}templateak gp(Far,const F::dp>&cz){std::reverse(ar.begin(),ar.end());ak C;int cd=0;gq(C,ar,0,cz,cd);assert(cd==int(cz.size()));return C;}inline int ey(const F&ar){int64_t aV=1;for(int aA:ar){assert(aA>0);aV*=aA;assert(aV<=std::numeric_limits::max());}return int(aV);}inline FhY(const F&ar){const int bF=int(ar.size());const int aU=ey(ar);Fdy(aU);if(bF==0)return dy;for(int bM=0;bMFff(const F&fu,e ratio){const int ci=int(fu.size());if(ci<=64){FC(ci);e hq=1;for(int i=0;iC(cV);if(cV==0)return C;C[0]=1;e bU=1;for(int i=0;i+1iI=gx(ratio,2*ci-1);Fbw=gx(ratio.inv(),ci);FeS(fu);for(int i=0;ibK=dD::gO(eS,iI);FC(ci);for(int i=0;iFgn(const F&ar,const F&ah,const F&ao){static_assert(dD::internal::fi::value,"truncated multivariate convolution requires a static-modulus type");const int bF=int(ar.size());const int aU=internal::ey(ar);assert(int(ah.size())==aU);assert(int(ao.size())==aU);if(bF==0)return{ah[0]*ao[0]};int64_t eA=1;while(eA<2LL*aU-1)eA<<=1;assert(eA<=std::numeric_limits::max());const int an=int(eA);assert((e::o()-1)%uint32_t(an)==0);const Fdy=internal::hY(ar);F>bY(bF,F(an));F>dj(bF,F(an));for(int i=0;i>bv(bF,F(an));for(int cp=0;cp&iw=bv[(cp+co)%bF];const F&ix=bY[cp];const F&it=dj[co];for(int i=0;iC(aU);for(int i=0;i::cY>0),int> =0>ak gn(const ak&ah,const ak&ao){using e=typename internal::bt::dp;Fdl,dk;Far=internal::go(ah,ao,dl,dk);Ffk=gn(ar,dl,dk);return internal::gp(std::move(ar),fk);}templateFex(const F&ar,const F&ah,const F&ao){const int aU=internal::ey(ar);assert(int(ah.size())==aU);assert(int(ao.size())==aU);if(ar.empty())return{ah[0]*ao[0]};const uint32_t cC=e::o();H gG=true;for(int aA:ar){if((cC-1)%uint32_t(aA)!=0)gG=false;}if(!gG){FbE;for(int aA:ar){if(aA!=1)bE.push_back(aA);}if(bE.empty())return{ah[0]*ao[0]};FdP(bE.size());for(int i=0;i::max());dP[i]=int(he);}const int eG=internal::ey(dP);int64_t ez=0;int64_t fm=1;for(int aE=0;aE::max());const int gr=int(ez)+1;FgI(gr);FgF(gr);for(int bM=0;bMgB=dD::gO(gI,gF);assert(int(gB.size())==eG);FC(aU);for(int cL=0;cLbY(ah);Fdj(ao);int aO=1;for(int aA:ar){assert((cC-1)%uint32_t(aA)==0);const e cr=e(dS).pow((cC-1)/aA);for(int V=0;VeJ(aA);FeH(aA);for(int i=0;ieV(aA);for(int i=0;i::cY>0),int> =0>ak ex(const ak&ah,const ak&ao){using e=typename internal::bt::dp;Fdl,dk;Far=internal::go(ah,ao,dl,dk);Ffk=ex(ar,dl,dk);return internal::gp(std::move(ar),fk);}}}using eq=aI::ch::ij;P iQ(){ll X,Y,Z;fV(X,Y,Z);vv(string,A,Z,Y);vv(string,B,Z,Y);FOR(z,Z)FOR(y,Y){fV(A[z][y]);}FOR(z,Z)FOR(y,Y){fV(B[z][y]);}vvv(eq,A_black,Z,Y,X,0);vvv(eq,A_white,Z,Y,X,0);vvv(eq,inv_B_black,Z,Y,X,0);vvv(eq,inv_B_white,Z,Y,X,0);FOR(z,Z)FOR(y,Y)FOR(x,X){if(A[z][y][x]=='B'){A_black[z][y][x]=1;}if(A[z][y][x]=='W'){A_white[z][y][x]=1;}}FOR(z,Z)FOR(y,Y)FOR(x,X){if(B[z][y][x]=='B'){inv_B_black[Z-z-1][Y-y-1][X-x-1]=1;}if(B[z][y][x]=='W'){inv_B_white[Z-z-1][Y-y-1][X-x-1]=1;}}auto C1=aI::ch::ex(A_black,inv_B_white);auto C2=aI::ch::ex(A_white,inv_B_black);ll hv=bj;FOR(z,Z)FOR(y,Y)FOR(x,X){eq c=C1[z][y][x]+C2[z][y][x];iN(hv,c.val());}fL(hv);}int main(){CPP_DUMP_SET_OPTION(max_line_width,80);CPP_DUMP_SET_OPTION(log_label_func,cpp_dump::log_label::filename());CPP_DUMP_SET_OPTION(enable_asterisk,true);int T=1;while(T--)iQ();return 0;}