#include using namespace std; using u64 = unsigned long long; using i64 = long long; template struct modint{ u64 val; modint(i64 val_=0):val((val_%i64(mod)+i64(mod))%i64(mod)){} modint operator-(){ return (val==0)?0:mod-val; } modint operator+(modint rhs){ return modint(*this)+=rhs; } modint operator-(modint rhs){ return modint(*this)-=rhs; } modint operator*(modint rhs){ return modint(*this)*=rhs; } modint operator/(modint rhs){ return modint(*this)/=rhs; } modint operator^(i64 rhs){ return modint(*this)^=rhs; } modint &operator+=(modint rhs){ val+=rhs.val,val-=((val>=mod)?mod:0); return (*this); } modint &operator-=(modint rhs){ val+=((val>=1; } return (*this)=res; } bool operator==(modint rhs){ return val==rhs.val; } bool operator!=(modint rhs){ return val!=rhs.val; } friend std::ostream &operator<<(std::ostream& os,modint x){ return os<<(x.val); } friend std::istream &operator>>(std::istream& is,modint& x){ u64 t; is>>t,x=t; return is; } }; int check(array& a){ if(a[0]+a[1]==0){ return 2; } if(a[0] && a[1]){ return 0; } return 1; } int main(){ constexpr u64 mod = 1000000007; typedef modint mint; int n,m; array tmp({0,0}); scanf("%d%d", &n, &m); vector S(n); for(int i=0;i>S[i]; } vector h(3),w(3); h[2]=n,w[2]=m; vector> mph(n+1),mpw(m+1); vector> sth(n+1,{0,0}),stw(m+1,{0,0}); //mph[x] -> y : t + 1 for(int i=0;i