using aa=long long;using ab=long double;using ad=bool;using ak=double;using as=unsigned;using aJ=void;using aM=unsigned char;using bc=char;using bj=__uint128_t;using bk=unsigned long long;using bv=__int128_t; #define M1UNE_FPS_DISABLE_X86_SIMD 1 #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 templateusing ba=std::pair; #include #include #include templateusing m=std::vector; #include #include #include namespace ay{namespace cy{namespace ag{templatestruct ge:std::false_type{};templatestruct ge())),decltype(std::end(std::declval()))>>:std::true_type{};templateinline constexpr ad cx=ge::value;templateusing gT=decltype(*std::begin(std::declval()));templateusing hm=std::remove_cv_t>>;templatestruct fk{using type=hm;};templatestruct fk>::value_type>>{using type=typename std::remove_cv_t>::value_type;};templateusing fe=typename fk::type;templatestruct fy:std::false_type{};templatestruct fy:std::bool_constant,bc>>{};templatestruct hd:std::bool_constant,std::string>||std::is_same_v,const bc*>||std::is_same_v,bc*>||fy>::value>{};templateinline constexpr ad dj=hd::value;templatestruct fu:std::false_type{};templatestruct fu().val())>>:std::true_type{};templateinline constexpr ad fo=fu::value;templatestruct fi:std::false_type{};templatestruct fi()))>>:std::true_type{};templateinline constexpr ad gO=fi::value;templateinline constexpr ad dr=std::is_integral_v||std::is_same_v,bv>||std::is_same_v,bj>;templateinline constexpr ad ed=std::is_signed_v||std::is_same_v,bv>;templatestruct dY{using type=std::make_unsigned_t;};template<>struct dY{using type=bj;};template<>struct dY{using type=bj;};templateusing hb=typename dY>::type;}struct bR{static constexpr int bn=1<<20;private:std::FILE*cj;bc aw[bn];int W;int aS;int di;ad ef;ad gp(){W=0;if(ef){ssize_t J;do{J=::read(di,aw,bn);}while(J<0&&errno==EINTR);if(J<=0){aS=0;return false;}aS=int(J);}else{aS=int(std::fread(aw,1,bn,cj));}return aS!=0;}templatead gK(T&f){if(!dv())return false;int c=aU();ad br=false;if(c=='-'){br=true;c=aU();}if constexpr(ag::ed){T h=0;while('0'<=c&&c<='9'){h=br?h*10-(c-'0'):h*10+(c-'0');c=aU();}f=h;}else{T h=0;while('0'<=c&&c<='9'){h=h*10+T(c-'0');c=aU();}f=br?T(0)-h:h;}return true;}ad hg(){if(aS-W>=64)return true;const int bT=aS-W;if(bT>0)std::memmove(aw,aw+W,bT);const int hT=int(std::fread(aw+bT,1,bn-bT,cj));W=0;aS=bT+hT;if(aS=0&&::fstat(di,&gr)==0&&!S_ISREG(gr.st_mode);}()){}bR(const bR&)=delete;bR&operator=(const bR&)=delete;int aU(){if(W==aS&&!gp())return EOF;return aw[W++];}ad dv(){int c=aU();while(c!=EOF&&c<=' ')c=aU();if(c==EOF)return false;--W;return true;}ad read(bc&f){if(!dv())return false;f=bc(aU());return true;}ad read(std::string&f){if(!dv())return false;f.clear();while(true){const int begin=W;while(W(aw[W])>' '){++W;}f.append(aw+begin,W-begin);if(Wstd::enable_if_t&&!std::is_same_v,ad>&&!std::is_same_v,bc>,ad>read(T&f){if(ef)return gK(f);if(!hg())return false;int c=static_cast(aw[W++]);while(c<=' ')c=static_cast(aw[W++]);ad br=false;if(c=='-'){br=true;c=static_cast(aw[W++]);}if constexpr(ag::ed){T h=0;while('0'<=c&&c<='9'){const int H=c-'0';const int R=static_cast(aw[W])-'0';if(0<=R&&R<=9){h=br?h*100-(H*10+R):h*100+(H*10+R);++W;}else{h=br?h*10-H:h*10+H;}c=static_cast(aw[W++]);}f=h;}else{T h=0;while('0'<=c&&c<='9'){const as H=as(c-'0');const int R=static_cast(aw[W])-'0';if(0<=R&&R<=9){h=h*100+T(H*10+as(R));++W;}else{h=h*10+T(H);}c=static_cast(aw[W++]);}f=br?T(0)-h:h;}if(W>aS)W=aS;return true;}templatestd::enable_if_t,ad>read(T&f){if(!dv())return false;int c=aU();ad br=false;if(c=='-'||c=='+'){br=c=='-';c=aU();}ab h=0;while('0'<=c&&c<='9'){h=h*10+(c-'0');c=aU();}if(c=='.'){ab gt=0.1L;c=aU();while('0'<=c&&c<='9'){h+=(c-'0')*gt;gt*=0.1L;c=aU();}}if(c=='e'||c=='E'){c=aU();ad fm=false;if(c=='-'||c=='+'){fm=c=='-';c=aU();}int aB=0;while('0'<=c&&c<='9'){aB=aB*10+(c-'0');c=aU();}ab eM=1;ab eJ=10;while(aB>0){if(aB&1)eM*=eJ;eJ*=eJ;aB>>=1;}h=fm?h/eM:h*eM;}f=static_cast(br?-h:h);return true;}templatestd::enable_if_t&&!ag::dr&&!ag::cx,ad>read(T&f){aa x;if(!read(x))return false;if constexpr(ag::gO){if(x>=0&&uint64_t(x)ad read(ba&f){if(!read(f.first))return false;return read(f.second);}templatestd::enable_if_t&&!ag::dj,ad>read(bH&eL){using cf=ag::fe;constexpr ad dE=ag::cx&&!ag::dj;for(auto&&f:eL){if constexpr(std::is_same_v&&!dE){ad x;if(!read(x))return false;f=x;}else{if(!read(f))return false;}}return true;}templatead read(cl&H,cU&R,eP&...rest){if(!read(H))return false;return read(R,rest...);}templatebR&operator>>(T&f){if(!read(f))std::abort();return*this;}};struct bB{static constexpr int bn=1<<20;private:inline static const auto cM=[]{std::arrayh{};for(int i=0;i<10000;i++){int f=i;for(int j=3;j>=0;j--){h[4*i+j]=bc('0'+f%10);f/=10;}}return h;}();std::FILE*cj;bc aw[bn];int W;int cN;std::chars_format dq;bc dT;public:explicit bB(std::FILE*dF=stdout):cj(dF),W(0),cN(6),dq(std::chars_format::general),dT(' '){}bB(const bB&)=delete;bB&operator=(const bB&)=delete;~bB(){dH();}aJ dH(){if(W!=0){std::fwrite(aw,1,W,cj);W=0;}std::fflush(cj);}aJ bo(bc c){if(W==bn)dH();aw[W++]=c;}aJ aT(const bc*s){while(*s!='\0')bo(*s++);}aJ aT(const std::string&s){std::size_t aG=0;while(aG(bn-W,s.size()-aG);std::memcpy(aw+W,s.data()+aG,ck);W+=int(ck);aG+=ck;}}aJ aT(bc c){bo(c);}aJ aT(ad f){bo(f?'1':'0');}templatestd::enable_if_t>aT(T f){bc bF[128];auto[end,hV]=std::to_chars(bF,bF+sizeof(bF),f,dq,cN);if(hV!=std::errc())std::abort();for(const bc*ew=bF;ew!=end;ew++){bo(*ew);}}templatestd::enable_if_t&&!std::is_same_v,ad>&&!std::is_same_v,bc> >aT(T f){using gx=std::remove_cv_t;using cS=ag::hb;cS at;if constexpr(ag::ed){if(f<0){bo('-');at=cS(0)-cS(f);}else{at=cS(f);}}else{at=f;}if(at==0){bo('0');return;}as gl[16];int bJ=0;while(at>=10000){const cS ae=at/10000;gl[bJ++]=as(at-ae*10000);at=ae;}if(W>bn-64)dH();const as bs=as(at);const bc*H=cM.data()+4*bs;int eS=bs<10?3:bs<100?2:bs<1000?1:0;for(;eS<4;eS++)aw[W++]=H[eS];while(bJ--){const bc*bF=cM.data()+4*gl[bJ];std::memcpy(aw+W,bF,4);W+=4;}}templatestd::enable_if_t&&!ag::dr&&!ag::cx >aT(const T&f){aT(f.val());}templateaJ aT(const ba&f){aT(f.first);bo(' ');aT(f.second);}templatestd::enable_if_t&&!ag::dj >aT(const bH&eL){using cf=ag::fe;constexpr ad dE=ag::cx&&!ag::dj;ad H=true;for(const auto&f:eL){if(!H)bo(dE?'\n':dT);H=false;if constexpr(std::is_same_v&&!dE){aT(static_cast(f));}else{aT(f);}}}templateaJ eK(const cl&H,const eP&...rest){aT(H);((bo(' '),aT(rest)),...);}aJ println(){bo('\n');}aJ iA(int aQ){cN=aQ;}aJ iI(int aQ=6){dq=std::chars_format::fixed;cN=aQ;}aJ iC(int aQ=6){dq=std::chars_format::general;cN=aQ;}aJ iv(bc hK){dT=hK;}templateaJ println(const Args&...args){eK(args...);bo('\n');}templatebB&operator<<(const T&f){aT(f);return*this;}};}}using namespace std;namespace ay{namespace bx{inline cy::bR&bg(){static cy::bR eo;return eo;}inline cy::bB&aX(){static cy::bB eo;return eo;}}}using ll=aa;using cF=unsigned int;using cG=bk;using eR=__int128;using iZ=unsigned __int128; #ifdef __SIZEOF_FLOAT128__ using iX=__float128; #endif templateconstexpr T aZ=0;template<>constexpr int aZ =1'000'000'000;template<>constexpr ll aZ =ll(aZ)*aZ*2;template<>constexpr cF aZ =aZ;template<>constexpr cG aZ =aZ;template<>constexpr eR aZ =eR(aZ)*aZ;template<>constexpr ak aZ =aZ;template<>constexpr ab aZ =aZ;using pi=pair;using pl=pair;using vi=vector;using vl=vector;templateusing vc=vector;templateusing eU=vector>;using jg=eU;using jh=eU;templateusing ih=vector>;templateusing ic=vector>;templateusing iP=vector>;templateusing jf=std::priority_queue,greater>;templateusing ja=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 eE(int x){return __builtin_popcount(x);}int eE(cF x){return __builtin_popcount(x);}int eE(ll x){return __builtin_popcountll(x);}int eE(cG x){return __builtin_popcountll(x);}int ea(int x){return __builtin_parity(x);}int ea(cF x){return __builtin_parity(x);}int ea(ll x){return __builtin_parityll(x);}int ea(cG x){return __builtin_parityll(x);}int eG(int x){return(x==0?-1:31-__builtin_clz(x));}int eG(cF x){return(x==0?-1:31-__builtin_clz(x));}int eG(ll x){return(x==0?-1:63-__builtin_clzll(x));}int eG(cG x){return(x==0?-1:63-__builtin_clzll(x));}int eC(int x){return(x==0?-1:__builtin_ctz(x));}int eC(cF x){return(x==0?-1:__builtin_ctz(x));}int eC(ll x){return(x==0?-1:__builtin_ctzll(x));}int eC(cG x){return(x==0?-1:__builtin_ctzll(x));}templateT dG(T a,T b){return a/b-(a%b&&(a^b)<0);}templateT ie(T x,T y){return dG(x+y-1,y);}templateT iW(T x,T y){return x-y*dG(x,y);}templatepaireB(T x,T y){T q=dG(x,y);return{q,x-q*y};}templateT jb(U x_,int n){T x=x_;T gB=1;while(n>0){if(n&1)gB*=x;x*=x;n>>=1;}return gB;}templateT jc(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 ad iS(T&a,const S&b){return(ainline ad iT(T&a,const S&b){return(a>b?a=b,1:0);}vciL(const string&S,bc hA){vcA(S.size());FOR(i,S.size()){A[i]=(S[i]!='?'?S[i]-hA:-1);}return A;}templatevectoriN(vector&A,int im=1){int N=A.size();vectorB(N+1);FOR(i,N){B[i+1]=B[i]+A[i];}if(im==0)B.erase(B.begin());return B;}templatevectoriJ(const vector&A){vectoreT(A.size());iota(all(eT),0);sort(all(eT),[&](int i,int j){return(A[i]==A[j]?ivciH(const vc&A,const vc&I){vcB(I.size());FOR(i,I.size())B[i]=A[I[i]];return B;}templateconstexpr auto il(T...a){return il(initializer_list>{a...});}templateconstexpr auto ik(T...a){return ik(initializer_list>{a...});}templatead gw(Ts&...O){return ay::bx::bg().read(O...);}templateaJ eK(const Ts&...O){ay::bx::aX().println(O...);}aJ iQ(ad b){ay::bx::aX().println(b?"YES":"NO");}aJ iR(ad b){ay::bx::aX().println(b?"Yes":"No");}aJ jd(){ay::bx::aX().println("YES");}aJ NO(){ay::bx::aX().println("NO");}aJ je(){ay::bx::aX().println("Yes");}aJ No(){ay::bx::aX().println("No");}auto&iO=ay::bx::bg();auto&iK=ay::bx::aX(); #if (defined(__GNUC__) || defined(__clang__)) && (defined(__x86_64__) || defined(__i386__)) #include #define M1UNE_BIGINT_HAS_X86_SIMD 1 #endif #if defined(__GNUC__) && !defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) && !defined(M1UNE_FPS_DISABLE_X86_SIMD) #include #define M1UNE_FPS_HAS_X86_SIMD 1 #pragma GCC push_options #pragma GCC target("avx2,bmi") #endif namespace ay{namespace bX{templatestruct L{static_assert(0,int> =0>constexpr L(ci v)noexcept{if constexpr(std::is_signed_v){int64_t x=static_cast(v)%static_cast(aR);if(x<0)x+=aR;G=static_cast(x);}else{G=static_cast(static_cast(v)%aR);}}constexpr uint32_t val()const noexcept{return G;}constexpr L&operator++()noexcept{G++;if(G==aR)G=0;return*this;}constexpr L&operator--()noexcept{if(G==0)G=aR;G--;return*this;}constexpr L operator++(int)noexcept{L az=*this;++*this;return az;}constexpr L operator--(int)noexcept{L az=*this;--*this;return az;}constexpr L&operator+=(const L&k)noexcept{G+=k.G;if(G>=aR)G-=aR;return*this;}constexpr L&operator-=(const L&k)noexcept{G-=k.G;if(G>=aR)G+=aR;return*this;}constexpr L&operator*=(const L&k)noexcept{uint64_t z=G;z*=k.G;G=static_cast(z%aR);return*this;}constexpr L&operator/=(const L&k)noexcept{return*this*=k.inv();}constexpr L operator+(const L&k)const noexcept{return L(*this)+=k;}constexpr L operator-(const L&k)const noexcept{return L(*this)-=k;}constexpr L operator*(const L&k)const noexcept{return L(*this)*=k;}constexpr L operator/(const L&k)const noexcept{return L(*this)/=k;}constexpr ad operator==(const L&k)const noexcept{return G==k.G;}constexpr ad operator!=(const L&k)const noexcept{return G!=k.G;}constexpr L pow(aa n)const noexcept{L az=bZ(1%aR);L x=n<0?inv():*this;uint64_t aB=n<0?uint64_t(-(n+1))+1:uint64_t(n);while(aB>0){if(aB&1)az*=x;x*=x;aB>>=1;}return az;}constexpr L inv()const noexcept{int64_t a=G,b=aR,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%=aR;if(u<0)u+=aR;return bZ(static_cast(u));}friend std::ostream&operator<<(std::ostream&os,const L&k){return os<>(std::istream&is,L&k){aa v;is>>v;k=L(v);return is;}};using iy=L<998244353>;using ix=L<1000000007>;templatestruct ac{private:uint32_t G;inline static uint32_t aO=1;public:static uint32_t E()noexcept{return aO;}static aJ iM(uint32_t ev)noexcept{assert(ev>0);assert(ev<=uint32_t(1)<<31);aO=ev;}static ac bZ(uint32_t v)noexcept{assert(v,int> =0>ac(ci v)noexcept{if constexpr(std::is_signed_v){int64_t x=static_cast(v)%static_cast(aO);if(x<0)x+=aO;G=static_cast(x);}else{G=static_cast(static_cast(v)%aO);}}uint32_t val()const noexcept{return G;}ac&operator++()noexcept{G++;if(G==aO)G=0;return*this;}ac&operator--()noexcept{if(G==0)G=aO;G--;return*this;}ac operator++(int)noexcept{ac h=*this;++*this;return h;}ac operator--(int)noexcept{ac h=*this;--*this;return h;}ac&operator+=(const ac&k)noexcept{G+=k.G;if(G>=aO)G-=aO;return*this;}ac&operator-=(const ac&k)noexcept{G-=k.G;if(G>=aO)G+=aO;return*this;}ac&operator*=(const ac&k)noexcept{G=static_cast(uint64_t(G)*k.G%aO);return*this;}ac&operator/=(const ac&k)noexcept{return*this*=k.inv();}ac operator+(const ac&k)const noexcept{return ac(*this)+=k;}ac operator-(const ac&k)const noexcept{return ac(*this)-=k;}ac operator*(const ac&k)const noexcept{return ac(*this)*=k;}ac operator/(const ac&k)const noexcept{return ac(*this)/=k;}ad operator==(const ac&k)const noexcept{return G==k.G;}ad operator!=(const ac&k)const noexcept{return G!=k.G;}ac pow(aa aB)const noexcept{ac h=bZ(1%aO);ac bW=aB<0?inv():*this;uint64_t at=aB<0?uint64_t(-(aB+1))+1:uint64_t(aB);while(at>0){if(at&1)h*=bW;bW*=bW;at>>=1;}return h;}ac inv()const noexcept{int64_t a=G,b=aO,u=1,v=0;while(b){int64_t ae=a/b;a-=ae*b;std::swap(a,b);u-=ae*v;std::swap(u,v);}assert(a==1);u%=aO;if(u<0)u+=aO;return bZ(static_cast(u));}friend std::ostream&operator<<(std::ostream&os,const ac&k){return os<>(std::istream&is,ac&k){aa f;is>>f;k=ac(f);return is;}};}}namespace ay{namespace gA{namespace ag{templatestruct fj:std::false_type{};templatestruct fj{})>>:std::true_type{};constexpr uint32_t gJ(uint32_t E){if(E==2)return 1;if(E==167772161)return 3;if(E==469762049)return 3;if(E==754974721)return 11;if(E==998244353)return 3;if(E==1224736769)return 3;uint32_t en[32]={};int bJ=0;uint32_t x=E-1;for(uint32_t p=2;uint64_t(p)*p<=x;p++){if(x%p!=0)continue;en[bJ++]=p;while(x%p==0)x/=p;}if(x>1)en[bJ++]=x;for(uint32_t g=2;;g++){ad ok=true;for(int i=0;i0){if(aB&1)f=f*bW%E;bW=bW*bW%E;aB>>=1;}if(f==1){ok=false;break;}}if(ok)return g;}}constexpr int fx(uint32_t x){int h=0;while((x&1)==0){x>>=1;h++;}return h;}templatestruct ej{static constexpr int bE=fx(l::E()-1);std::arrayap;std::arraycw;std::arraygv;std::arrayfF;std::arrayfQ;std::arrayff;ej(){constexpr uint32_t hh=gJ(l::E());for(int cB=1;cB<=bE;cB++){ap[cB]=l(hh).pow((l::E()-1)>>cB);cw[cB]=ap[cB].inv();}l X=1;l cL=1;for(int i=0;i+1const ej&hF(){static const ejan;return an;}templateaJ dd(m&a,ad ax,ad hE=true){const int n=int(a.size());assert(n>0&&(n&(n-1))==0);assert((l::E()-1)%uint32_t(n)==0);const auto&an=hF();const int bu=fx(uint32_t(n));if(!ax){int ar=0;while(ar0){if(ar==1){const int av=1<<(bu-ar);l aN=1;for(int aj=0;aj<(1<<(ar-1));aj++){const int o=aj<<(bu-ar+1);for(int i=0;imgR(const m&a,const m&b){if(a.empty()||b.empty())return{};mh(a.size()+b.size()-1);if(a.size()mfr(const m&a,const m&b){const int aF=int(a.size()+b.size()-1);int n=1;while(nfa(n);std::copy(a.begin(),a.end(),fa.begin());ag::dd(fa,false);const l dx=l(n).inv();if(dA){for(int i=0;ifb(n);std::copy(b.begin(),b.end(),fb.begin());ag::dd(fb,false);for(int i=0;imgG(const m&a,const m&b,int aq){assert(l::E()==998244353);assert(aq>=2&&(aq&(aq-1))==0);assert((l::E()-1)%uint32_t(aq)==0);const int be=aq/2;const int ek=int((a.size()+be-1)/be);const int el=int((b.size()+be-1)/be);auto fq=[&](const m&O,int dt){m>eA;eA.reserve(dt);for(int aj=0;ajee(aq);std::copy_n(O.begin()+begin,bJ,ee.begin());dd(ee,false);eA.emplace_back(std::move(ee));}return eA;};m>hn=fq(a,ek);m>ho=fq(b,el);const int aF=int(a.size()+b.size()-1);mh(aF);mcI(aq);for(int bq=0;bqmgH(const m&a,const m&b,int aq=1<<23){return gG(a,b,aq);}}templatemfL(const m&a,const m&b){if(a.empty()||b.empty())return{};if(std::min(a.size(),b.size())<=32)return gR(a,b);const int aF=int(a.size()+b.size()-1);int n=1;while(n::value){if constexpr(l::E()==998244353){if(n>(1<<23))return ag::gH(a,b);}if((l::E()-1)%uint32_t(n)==0)return fr(a,b);}using by=bX::L<167772161>;using aY=bX::L<469762049>;using aL=bX::L<754974721>;assert(n<=(1<<24));[[maybe_unused]]const unsigned __int128 cJ=static_cast(std::min(a.size(),b.size()))*(l::E()-1)*(l::E()-1);[[maybe_unused]]const unsigned __int128 hv=static_cast(by::E())*aY::E()*aL::E();assert(cJ(){mfJ(a.size());mfK(b.size());for(int i=0;ic1=dK.template operator()();mc2=dK.template operator()();mc3=dK.template operator()();static const uint64_t dQ=aY(by::E()).inv().val();static const uint64_t ga=by::E()%aL::E();static const uint64_t he=ga*(aY::E()%aL::E())%aL::E();static const uint64_t gL=aL(uint32_t(he)).inv().val();const uint64_t bQ=l::E();const uint64_t fN=by::E()%bQ;const uint64_t ha=fN*(aY::E()%bQ)%bQ;mh(aF);for(int i=0;ia;int P;D():P(1){}D(aa v){*this=v;}D(const std::string&s){read(s);}D&operator=(aa v){P=1;bk at=static_cast(v);if(v<0){P=-1;at=0-at;}a.clear();for(;at>0;at/=F){a.push_back(int(at%F));}return*this;}D&operator=(const std::string&s){read(s);return*this;}aJ trim(){while(!a.empty()&&a.back()==0){a.pop_back();}if(a.empty())P=1;}aJ read(const std::string&s){P=1;a.clear();int bY=0;while(bY<(int)s.size()&&(s[bY]=='-'||s[bY]=='+')){if(s[bY]=='-')P=-1;++bY;}a.reserve((int(s.size())-bY+bP-1)/bP);for(int i=int(s.size())-1;i>=bY;i-=bP){int x=0;for(int j=std::max(bY,i-bP+1);j<=i;++j){x=x*10+(s[j]-'0');}a.push_back(x);}trim();}std::string to_string()const{if(a.empty())return"0";static const auto cM=[]{std::arraybF{};for(int f=0;f<10000;++f){int Q=f;for(int bK=3;bK>=0;--bK){bF[4*f+bK]=bc('0'+Q%10);Q/=10;}}return bF;}();bc bs[bP];const std::to_chars_result eh=std::to_chars(bs,bs+bP,a.back());assert(eh.ec==std::errc());const int fG=int(eh.ptr-bs);std::string az((P==-1)+fG+(a.size()-1)*bP,'0');int o=0;if(P==-1)az[o++]='-';std::copy(bs,eh.ptr,az.begin()+o);o+=fG;for(int i=(int)a.size()-2;i>=0;--i){const as f=as(a[i]);const as fz=f/100000000;const as bT=f-fz*100000000;const as gn=bT/10000;const as hM=bT-gn*10000;az[o]=bc('0'+fz);std::memcpy(az.data()+o+1,cM.data()+4*gn,4);std::memcpy(az.data()+o+5,cM.data()+4*hM,4);o+=bP;}return az;}ad is_zero()const{return a.empty()||(a.size()==1&&a[0]==0);}D operator-()const{D az=*this;if(!is_zero())az.P=-P;return az;}D abs()const{D az=*this;az.P=1;return az;}friend ad operator<(const D&x,const D&y){if(x.P!=y.P)return x.Py.a.size());}for(int i=(int)x.a.size()-1;i>=0;--i){if(x.a[i]!=y.a[i]){return(x.P==1)?(x.a[i]y.a[i]);}}return false;}friend ad operator>(const D&x,const D&y){return y=(const D&x,const D&y){return!(x0){dh(a,K.a);}else{mh=K.a;dh(h,a);a=std::move(h);P=K.P;}return*this;}fc(a,K.a);return*this;}D&operator-=(const D&K){if(K.is_zero())return*this;if(is_zero())return*this=-K;if(P!=K.P){fc(a,K.a);return*this;}const int cO=dR(a,K.a);if(cO==0){a.clear();P=1;}else if(cO>0){dh(a,K.a);}else{mh=K.a;dh(h,a);a=std::move(h);P=-P;}return*this;}D&operator*=(int v){if(v==0||is_zero())return*this=0;aa bC=v;if(bC<0){P=-P;bC=-bC;}a.reserve(a.size()+2);aa V=0;for(int i=0;i<(int)a.size()||V;++i){if(i==(int)a.size())a.push_back(0);const aa gy=a[i]*bC+V;V=gy/F;a[i]=(int)(gy%F);}trim();return*this;}private:static constexpr int gI=128;static constexpr int gU=224;static constexpr int dM=64;static constexpr int bD=1<<15;struct C{ak ah;ak af;C operator+(const C&K)const{return{ah+K.ah,af+K.af};}C operator-(const C&K)const{return{ah-K.ah,af-K.af};}C operator*(const C&K)const{return{ah*K.ah-af*K.af,ah*K.af+af*K.ah};}C operator*(ak gq)const{return{ah*gq,af*gq};}C conjugate()const{return{ah,-af};}};struct eb{C bq;C cm;};static const m&cR(int size){static man(2,C{1,0});if(int(an.size())/J;const ab gc=std::cos(gs);const ab fw=std::sin(gs);for(int i=J;i<2*J;++i){an[i]=an[i/2];if(i&1){const ab ah=an[i].ah;const ab af=an[i].af;an[i]={ak(ah*gc-af*fw),ak(ah*fw+af*gc)};}}J*=2;}}return an;} #ifdef M1UNE_BIGINT_HAS_X86_SIMD __attribute__((target("avx2,fma"),always_inline))static inline __m256d multiply_complex(__m256d f,__m256d ap){const __m256d ah=_mm256_movedup_pd(f);const __m256d af=_mm256_permute_pd(f,0xf);const __m256d swapped_root=_mm256_permute_pd(ap,0x5);return _mm256_fmaddsub_pd(ah,ap,_mm256_mul_pd(af,swapped_root));}__attribute__((target("avx2,fma"),hot))static aJ hL(C*O,int size){const m&an=cR(size);for(int J=size/2;J>0;J/=2){for(int o=0;o(O+o+i));const __m256d aD=_mm256_loadu_pd(reinterpret_cast(O+o+i+J));const __m256d ap=_mm256_loadu_pd(reinterpret_cast(an.data()+J+i));_mm256_storeu_pd(reinterpret_cast(O+o+i),_mm256_add_pd(aC,aD));_mm256_storeu_pd(reinterpret_cast(O+o+i+J),multiply_complex(_mm256_sub_pd(aC,aD),ap));}for(;i&an=cR(size);const __m256d conjugate_mask=_mm256_setr_pd(0.0,-0.0,0.0,-0.0);for(int J=1;J(O+o+i));const __m256d f=_mm256_loadu_pd(reinterpret_cast(O+o+i+J));__m256d ap=_mm256_loadu_pd(reinterpret_cast(an.data()+J+i));ap=_mm256_xor_pd(ap,conjugate_mask);const __m256d aD=multiply_complex(f,ap);_mm256_storeu_pd(reinterpret_cast(O+o+i),_mm256_add_pd(aC,aD));_mm256_storeu_pd(reinterpret_cast(O+o+i+J),_mm256_sub_pd(aC,aD));}for(;i(O+i));_mm256_storeu_pd(reinterpret_cast(O+i),_mm256_mul_pd(f,ds));}for(;i0&&(size&(size-1))==0); #ifdef M1UNE_BIGINT_HAS_X86_SIMD hL(O,size);return; #endif const m&an=cR(size);for(int J=size/2;J>0;J/=2){for(int o=0;o0&&(size&(size-1))==0); #ifdef M1UNE_BIGINT_HAS_X86_SIMD gY(O,size);return; #endif const m&an=cR(size);for(int J=1;J=2&&(size&(size-1))==0);const int bS=size/2;const m&an=cR(size);static mdN;static int fI=0;if(fI!=size){dN.resize(bS);mdy(bS);const int hX=std::countr_zero(as(bS));for(int i=1;i>1)|((i&1)<<(hX-1));}for(int i=0;i&f){while(!f.empty()&&f.back()==0)f.pop_back();}static ad cv(const m&w,const m&k){return dR(w,k)<0;}static int dR(const m&w,const m&k){if(w.size()!=k.size())return w.size()=0;--i){if(w[i]!=k[i])return w[i]&w,const m&k){const int gf=int(w.size());const int dz=int(k.size());const int size=std::max(gf,dz);if(gf=F?Q-F:Q);V=Q>=F;}while(i&w,const m&k){assert(!cv(w,k));int aW=0;for(int i=0;i&w,const m&k){return!cv(k,w);}static mdX(const m&w,const m&k){mh(std::max(w.size(),k.size())+1);for(int i=0;i=F){h[i]-=F;h[i+1]++;}}aK(h);return h;}static mbA(const m&w,const m&k){assert(!cv(w,k));mh=w;int aW=0;for(int i=0;ihf(const m&w,const m&k){if(w.empty()||k.empty())return m();mX(w.size()+k.size());constexpr aa cg=4LL*F*F;for(int i=0;i=cg){X[i+j]-=cg;X[i+j+1]+=4LL*F;}}}mh;h.reserve(X.size()+1);aa V=0;for(int i=0;i0;++i){if(iht(const m&f){if(f.empty())return m();mX(2*f.size());constexpr aa cg=4LL*F*F;for(int i=0;i=cg){X[2*i]-=cg;X[2*i+1]+=4LL*F;}for(int j=i+1;j=cg){X[i+j]-=cg;X[i+j+1]+=4LL*F;}}}mh;h.reserve(X.size()+1);aa V=0;for(int i=0;i0;++i){if(idk(const m&f,int bC){assert(0<=bC&&bC();mh;h.reserve(f.size()+1);uint64_t V=0;for(int ig:f){const uint64_t Q=uint64_t(ig)*bC+V;h.push_back(int(Q%F));V=Q/F;}if(V)h.push_back(int(V));return h;}static mdZ(const m&w,const m&k){using by=bX::L<998244353>;using aY=bX::L<754974721>;using aL=bX::L<469762049>;const int aF=int(w.size()+k.size()-1);assert(aF<=(1<<24));auto em=[&](){mx(w.begin(),w.end());if(&w==&k)return gA::fL(x,x);my(k.begin(),k.end());return gA::fL(x,y);};const mhH=em.template operator()();const mhI=em.template operator()();const mhJ=em.template operator()();constexpr uint64_t eO=by::E();constexpr uint64_t cZ=aY::E();constexpr uint64_t cC=aL::E();constexpr uint64_t eI=eO*cZ;const static uint64_t dQ=aY(eO).inv().val();const static uint64_t gP=aL(eI%cC).inv().val();[[maybe_unused]]const unsigned __int128 cJ=static_cast(std::min(w.size(),k.size()))*(F-1)*(F-1);[[maybe_unused]]constexpr unsigned __int128 hu=static_cast(eI)*cC;assert(cJh;h.reserve(aF+2);unsigned __int128 V=0;for(int i=0;i0;++i){if(i(eI)*hG;}h.push_back(int(V%F));V/=F;}aK(h);return h;}struct cH{uint32_t cW;uint32_t cV;};templatestatic uint32_t dn(uint64_t f){constexpr uint64_t dB=(uint64_t(1)<>eQ);f=(f&dB)+(f>>eQ);if(f>=dB)f-=dB;return uint32_t(f);}static cH dL(const m&f){cH h{0,0};for(int i=int(f.size())-1;i>=0;--i){h.cW=dn<31>(uint64_t(h.cW)*F+f[i]);h.cV=dn<29>(uint64_t(h.cV)*F+f[i]);}return h;}static ad hc(const m&w,const m&k,const m&X){const cH fZ=dL(w);const cH gb=dL(k);const cH gk=dL(X);return gk.cW==dn<31>(uint64_t(fZ.cW)*gb.cW)&&gk.cV==dn<29>(uint64_t(fZ.cV)*gb.cV);}static mhr(const m&w,const m&k){const int aF=int(w.size()+k.size()-1);const int aq=int(std::bit_ceil(as(aF)));const unsigned __int128 cJ=static_cast(std::min(w.size(),k.size()))*2*(bD-1)*((F-1)/bD);if(aq>(1<<20)||cJ>=(uint64_t(1)<<50)){return dZ(w,k);}std::unique_ptrbf(new C[aq]);for(int i=0;ibl(new C[aq]);if(!dA){for(int i=0;ict;if(int(ct.size())bU)continue;const eb eq=fg(i);eb dS=eq;if(i!=bU)dS=fg(bU);bf[i]=eq.bq;bf[bU]=dS.bq;bl[i]=eq.cm;bl[bU]=dS.cm;}fM(bf.get(),aq);gZ(bl.get(),aq);mh;h.reserve(aF+2);unsigned __int128 V=0;for(int i=0;i0;++i){if(i(cm)*bD+static_cast(gu)*bD*bD;}h.push_back(int(V%F));V/=F;}aK(h);if(h.empty()||!hc(w,k,h)){return dZ(w,k);}return h;}static mbz(const m&w,const m&k){if(w.empty()||k.empty())return m();if(w.size()==1)return dk(k,w[0]);if(k.size()==1)return dk(w,k[0]);if(&w==&k&&w.size()<=gU){return ht(w);}if(std::min(w.size(),k.size())<=gI){return hf(w,k);}return hr(w,k);}static ba,m>dp(const m&au,int am){assert(0());}mae(au.size());aa ao=0;for(int i=int(au.size())-1;i>=0;--i){const aa Q=ao*F+au[i];ae[i]=int(Q/am);ao=Q%am;}aK(ae);mfp;if(ao!=0)fp.push_back(int(ao));return std::make_pair(std::move(ae),std::move(fp));}static ba,m>fn(const m&au,const m&am){assert(!am.empty());if(am.size()==1)return dp(au,am[0]);if(cv(au,am)){return std::make_pair(m(),au);}const int bm=F/(am.back()+1);maE(am.size());uint64_t V=0;for(int i=0;iaA(au.size()+1);V=0;for(int i=0;iae(fC);for(int aG=fC-1;aG>=0;--aG){const uint64_t dU=uint64_t(aA[aG+bd])*F+aA[aG+bd-1];uint64_t bV=dU/dm;uint64_t ao=dU%dm;if(bV>=F){bV=F-1;ao=dU-bV*dm;}while(aoao*F+aA[aG+bd-2]){--bV;ao+=dm;}uint64_t aW=0;for(int i=0;i(aW);if(df<0){--bV;uint64_t eg=0;for(int i=0;iao(aA.begin(),aA.begin()+bd);aK(ao);ba,m>bO=dp(ao,bm);assert(bO.second.empty());return std::make_pair(std::move(ae),std::move(bO.first));}static mreciprocal(const m&f,int bt){assert(!f.empty());assert(F/2<=f.back()&&f.back()=0);int aQ=bt;const int fW=int(f.size());while(aQ>dM)aQ=(aQ+1)/2;max(fW+aQ+1);ax.back()=1;ax=fn(ax,f).first;while(aQeF=bz(ax,ax);eF.insert(eF.begin(),0);const int ck=std::min(fW,2*aQ+1);const mbs(f.end()-ck,f.end());mcP=bz(eF,bs);assert(int(cP.size())>=ck);cP.erase(cP.begin(),cP.begin()+ck);mey(aQ+1);const mgg=dX(ax,ax);ey.insert(ey.end(),gg.begin(),gg.end());ax=bA(ey,cP);assert(!ax.empty());ax.erase(ax.begin());aQ*=2;}assert(aQ>=bt);ax.erase(ax.begin(),ax.begin()+aQ-bt);aK(ax);return ax;}static ba,m>gW(const m&au,const m&am){assert(!am.empty());if(am.size()<=dM||int(au.size())-int(am.size())<=dM){return fn(au,am);}if(au.size()>2*am.size()){const int fV=int(au.size()/am.size());const int gV=fV>=16?3:fV>=7?2:1;const int be=gV*int(am.size());const int dt=(int(au.size())+be-1)/be;const int bm=F/(am.back()+1);const maE=dk(am,bm);const int bt=be+3;const max=reciprocal(aE,bt);const int cQ=int(am.size())+bt;auto hq=[&](const m&Q){const mdO=dk(Q,bm);mdV=bz(dO,ax);mbN;if(int(dV.size())>cQ){bN.assign(dV.begin()+cQ,dV.end());}mX=bz(aE,bN);while(cv(dO,X)){bN=bA(bN,m(1,1));X=bA(X,aE);}mcK=bA(dO,X);while(fd(aE,cK)){bN=dX(bN,m(1,1));cK=bA(cK,aE);}aK(bN);aK(cK);ba,m>bO=dp(cK,bm);assert(bO.second.empty());return std::make_pair(std::move(bN),std::move(bO.first));};mae(au.size());mao;for(int aj=dt-1;aj>=0;--aj){const int begin=aj*be;const int end=std::min(begin+be,int(au.size()));mQ(au.begin()+begin,au.begin()+end);Q.insert(Q.end(),ao.begin(),ao.end());aK(Q);ba,m>dD=hq(Q);assert(int(dD.first.size())<=end-begin);std::copy(dD.first.begin(),dD.first.end(),ae.begin()+begin);ao=std::move(dD.second);}aK(ae);aK(ao);return std::make_pair(std::move(ae),std::move(ao));}const int bm=F/(am.back()+1);const maA=bz(au,m(1,bm));const maE=bz(am,m(1,bm));const int hk=int(aA.size());const int bd=int(aE.size());const int bt=hk-bd+2;const max=reciprocal(aE,bt);mae=bz(aA,ax);const int cQ=bd+bt;assert(cQ<=int(ae.size()));ae.erase(ae.begin(),ae.begin()+cQ);mX=bz(aE,ae);while(cv(aA,X)){ae=bA(ae,m(1,1));X=bA(X,aE);}mao=bA(aA,X);while(fd(aE,ao)){ae=dX(ae,m(1,1));ao=bA(ao,aE);}aK(ae);aK(ao);ba,m>bO=dp(ao,bm);assert(bO.second.empty());return std::make_pair(std::move(ae),std::move(bO.first));}public:D&operator*=(const D&K){if(is_zero()||K.is_zero())return*this=0;const int hy=P*K.P;a=bz(a,K.a);P=hy;trim();return*this;}friend baeB(const D&a1,const D&b1){if(b1.is_zero()){throw std::domain_error("BigInt division by zero");}ba,m>h=gW(a1.a,b1.a);D q,r;q.a=std::move(h.first);r.a=std::move(h.second);q.P=a1.P*b1.P;r.P=a1.P;q.trim();r.trim();return{q,r};}friend D dc(D H,D R){H.P=1;R.P=1;while(!R.is_zero()){H%=R;std::swap(H,R);}return H;}D&operator/=(const D&K){return*this=eB(*this,K).first;}D&operator%=(const D&K){return*this=eB(*this,K).second;}friend D operator+(D x,const D&y){return x+=y;}friend D operator-(D x,const D&y){return x-=y;}friend D operator*(D x,const D&y){return x*=y;}friend D operator/(D x,const D&y){return x/=y;}friend D operator%(D x,const D&y){return x%=y;}friend std::ostream&operator<<(std::ostream&os,const D&b){return os<>(std::istream&is,D&b){std::string s;if(is>>s)b.read(s);return is;}};}} #ifdef M1UNE_BIGINT_HAS_X86_SIMD #undef M1UNE_BIGINT_HAS_X86_SIMD #endif namespace ay{namespace bX{namespace ft{templateconcept IntegerLike=std::signed_integral||(!std::integral&&std::copyable&&requires(T H,T R){T(0);T(1);{-H}->std::same_as;{H+R}->std::same_as;{H-R}->std::same_as;{H*R}->std::same_as;{H/R}->std::same_as;{H%R}->std::same_as;{H+=R}->std::same_as;{H-=R}->std::same_as;{H/=R}->std::same_as;{H==R}->std::convertible_to;{Hstd::convertible_to;});}templatestruct Y{static_assert(!std::signed_integral||sizeof(T)<=sizeof(aa));private:static constexpr ad dl=std::signed_integral;using Z=std::conditional_t;using aV=std::conditional_t;T ai;T al;static constexpr aV at(Z f){if constexpr(dl){if(f<0){return static_cast(-(f+1))+1;}return static_cast(f);}else{return f<0?-f:f;}}static constexpr aV dc(aV H,aV R){while(R!=0){aV ao=H%R;H=R;R=ao;}return H;}static constexpr T go(Z f){if constexpr(dl){assert(Z(std::numeric_limits::min())<=f);assert(f<=Z(std::numeric_limits::max()));return static_cast(f);}else{return f;}}constexpr aJ assign_normalized(Z numerator,Z denominator){assert(denominator!=0);if(numerator==0){ai=0;al=1;return;}aV am=dc(at(numerator),at(denominator));numerator/=static_cast(am);denominator/=static_cast(am);if(denominator<0){numerator=-numerator;denominator=-denominator;}ai=go(numerator);al=go(denominator);}static constexpr Y fY(Z numerator,Z denominator){Y h;h.assign_normalized(numerator,denominator);return h;}static bafh(const T&f){std::ostringstream aX;aX<::digits10+1;const std::size_t db=std::min(hQ,bi.size()-begin);ab du=0;for(std::size_t i=0;i(bi.size()-begin-1);return std::make_pair(P*du,aB);}public:constexpr Y():ai(0),al(1){}constexpr Y(T et):ai(et),al(1){}templaterequires std::constructible_from&&(!std::same_as,T>)constexpr Y(U et):Y(T(et)){}constexpr Y(T numerator,T denominator){assign_normalized(Z(numerator),Z(denominator));}constexpr T numerator()const{return ai;}constexpr T denominator()const{return al;}constexpr ad iG()const{return al==1;}constexpr int P()const{return(ai>0)-(ai<0);}constexpr Y reciprocal()const{assert(ai!=0);return fY(Z(al),Z(ai));}constexpr Y abs()const{return ai<0?-*this:*this;}constexpr ab dW()const requires requires(const T&f){static_cast(f);}{return static_cast(ai)/static_cast(al);}ab dW()const requires(!requires(const T&f){static_cast(f);}){const auto[numerator,gQ]=fh(ai);const auto[denominator,gN]=fh(al);return numerator/denominator*std::pow(10.0L,gQ-gN);}explicit constexpr operator ab()const requires requires(const T&f){static_cast(f);}{return dW();}explicit operator ab()const requires(!requires(const T&f){static_cast(f);}){return dW();}constexpr T iV()const{return ai/al;}constexpr T dG()const{T ae=ai/al;if(ai<0&&ai%al!=0)ae-=T(1);return ae;}constexpr T ie()const{T ae=ai/al;if(0(al),static_cast(K.al));Z fT=Z(K.al)/static_cast(gm);Z hz=Z(al)/static_cast(gm);assign_normalized(Z(ai)*fT+Z(K.ai)*hz,Z(al)*fT);return*this;}constexpr Y&operator-=(const Y&K){return*this+=-K;}constexpr Y&operator*=(const Y&K){aV fX=dc(at(Z(ai)),static_cast(K.al));aV fU=dc(at(Z(K.ai)),static_cast(al));assign_normalized((Z(ai)/static_cast(fX))*(Z(K.ai)/static_cast(fU)),(Z(al)/static_cast(fU))*(Z(K.al)/static_cast(fX)));return*this;}constexpr Y&operator/=(const Y&K){return*this*=K.reciprocal();}friend constexpr Y operator+(Y aI,const Y&aH){return aI+=aH;}friend constexpr Y operator-(Y aI,const Y&aH){return aI-=aH;}friend constexpr Y operator*(Y aI,const Y&aH){return aI*=aH;}friend constexpr Y operator/(Y aI,const Y&aH){return aI/=aH;}friend constexpr ad operator==(const Y&aI,const Y&aH){return aI.ai==aH.ai&&aI.al==aH.al;}friend constexpr std::strong_ordering operator<=>(const Y&aI,const Y&aH){Z H=Z(aI.ai)*Z(aH.al);Z R=Z(aH.ai)*Z(aI.al);if(H>(std::istream&bg,Y&f){std::string cY;if(!(bg>>cY))return bg;std::size_t cX=cY.find('/');if(cX!=std::string::npos&&cY.find('/',cX+1)!=std::string::npos){bg.setstate(std::ios::failbit);return bg;}T numerator=0;T denominator=1;std::istringstream fs(cY.substr(0,cX));if(!(fs>>numerator)||fs.peek()!=std::char_traits::eof()){bg.setstate(std::ios::failbit);return bg;}if(cX!=std::string::npos){std::istringstream fl(cY.substr(cX+1));if(!(fl>>denominator)||fl.peek()!=std::char_traits::eof()){bg.setstate(std::ios::failbit);return bg;}}f=Y(numerator,denominator);return bg;}};templateconstexpr Yabs(const Y&f){return f.abs();}}}namespace ay{namespace cA{templatestruct eN{using hD=T;int bh;int to;T bL;int id;ad bI;eN():bh(-1),to(-1),bL(T()),id(-1),bI(true){}eN(int hW,int in,T hU=T(1),int ij=-1,ad hR=true):bh(hW),to(in),bL(hU),id(ij),bI(hR){}int K(int v)const{assert(v==bh||v==to);return bh^to^v;}};templatestruct bG{using bp=eN;using hD=T;private:int _n;int bb;m>_g;m>>bw;public:bG():_n(0),bb(0){}explicit bG(int n):_n(n),bb(0),_g(n){assert(0<=n);}int size()const{return _n;}ad empty()const{return _n==0;}int iE()const{return bb;}int iD(){_g.emplace_back();return _n++;}int iw(int bh,int to,T bL=T(1)){assert(0<=bh&&bh<_n);assert(0<=to&&to<_n);int id=bb++;int cn=int(_g[bh].size());_g[bh].push_back(bp(bh,to,bL,id));bw.emplace_back();bw.back().push_back({bh,cn});return id;}int add_edge(int u,int v,T bL=T(1)){assert(0<=u&&u<_n);assert(0<=v&&v<_n);int id=bb++;int ia=int(_g[u].size());_g[u].push_back(bp(u,v,bL,id));int ib=int(_g[v].size());_g[v].push_back(bp(v,u,bL,id));bw.emplace_back();bw.back().push_back({u,ia});bw.back().push_back({v,ib});return id;}aJ fv(int id,ad bI){assert(0<=id&&id&operator[](int v)const{assert(0<=v&&v<_n);return _g[v];}m&operator[](int v){assert(0<=v&&v<_n);return _g[v];}const m>&hC()const{return _g;}m>&hC(){return _g;}miU(ad gX=false)const{mh;h.reserve(bb);mdb(bb,false);for(int v=0;v<_n;v++){for(const auto&e:_g[v]){if(!gX&&!e.bI)continue;if(0<=e.id&&e.idstruct cu{maP;mcz;meD;mfP;T cD=T();ad reachable(int v)const{assert(0<=v&&viY(int t)const{assert(reachable(t));mh;for(int v=t;v!=-1;v=eD[v])h.push_back(v);std::reverse(h.begin(),h.end());return h;}};namespace ag{templatestruct dP{T aP;int eH;};templatestruct gM{ad operator()(const dP&H,const dP&R)const{return R.aPcuch(const bG&g,const m&ez){int n=g.size();cuh;h.aP.resize(n);h.cz.assign(n,false);h.eD.assign(n,-1);h.fP.assign(n,-1);using da=ag::dP;using hN=ag::gM;std::priority_queue,hN>de;for(int s:ez){assert(0<=s&&scuch(const bG&g,int s){return ch(g,m{s});}templatecuch(const bG&g,const m&ez,const T&cD){cuh=ch(g,ez);h.cD=cD;for(int v=0;vcuch(const bG&g,int s,const T&cD){return ch(g,m{s},cD);}}}using ii=ay::bX::Y;aJ hY(){int N,M;gw(N,M);ay::cA::bGcA(N);FOR(M){int u,v,a,b;gw(u,v,a,b);--u,--v;cA.add_edge(u,v,{a,b});}auto az=ay::cA::ch(cA,0);auto&aP=az.aP;FOR(i,1,N){eK(aP[i].numerator().to_string(),aP[i].denominator().to_string());}}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--)hY();return 0;} #undef M1UNE_FPS_DISABLE_X86_SIMD