def main(io) n, m = io.get2 io.put_e 1 if n == 1 f = Fact(Mint).new(m) c = Mint.zero (0..m).each do |i| next unless (i % (n*2) == 0 || i % (n*2) == n*2-1) && (i+m) % 2 == 0 x = (i+m) // 2 c += f.combi(m, x) end (1..m).each do |i| next unless (i % (n*2) == 1 || i % (n*2) == 0) && (i+m) % 2 == 0 x = (i+m) // 2 c += f.combi(m, x) end io.put c end class Fact(T) def initialize(@n : Int32) @table = Array.new(@n+1, T.new(0)) @table[0] = T.multiplicative_identity (1..@n).each do |i| @table[i] = @table[i-1] * i end @inv_table = Array.new(@n+1, T.new(0)) @inv_table[@n] = T.multiplicative_identity // @table[@n] (1..@n).reverse_each do |i| @inv_table[i-1] = @inv_table[i] * i end end getter table : Array(T) getter inv_table : Array(T) def fact(n : Int) @table[n] end def perm(n : Int, r : Int) @table[n] * @inv_table[n-r] end def combi(n : Int, r : Int) @table[n] * @inv_table[r] * @inv_table[n-r] end def homo(n : Int, r : Int) combi(n+r-1, r) end @table : Array(T) @inv_table : Array(T) end macro min_u(a, b) {{a}} = Math.min({{a}}, {{b}}) end macro max_u(a, b) {{a}} = Math.max({{a}}, {{b}}) end def cdiv(a : Int, b : Int) (a + b - 1) // b end def isqrt(n : Int32) m = 46340 r = (1..m).bsearch { |i| i**2 > n } r.nil? ? m : r - 1 end def isqrt(n : Int64) m = 3037000499_i64 r = (1_i64..m).bsearch { |i| i**2 > n } r.nil? ? m : r - 1 end def powr(a : T, n : Int, i : T = T.multiplicative_identity) forall T powr(a, n, i) { |a, b| a * b } end def powr(a : T, n : Int, i : T = T.multiplicative_identity, &block) forall T return i if n == 0 r, b = i, a while n > 0 r = yield r, b if n.bit(0) == 1 b = yield b, b n >>= 1 end r end def ext_gcd(a : T, b : T) forall T if a == 0 {b, T.new(0), T.new(1)} else g, x, y = ext_gcd(b%a, a) {g, y-(b//a)*x, x} end end abstract struct ModInt < Number def self.zero self.new(0) end def self.additive_identity self.new(0) end def self.multiplicative_identity self.new(1) end def initialize(v : Int) @v = (v % @@mod).to_i64 end def_hash @@mod, @v def to_s @v.to_s end def to_s(io : IO) : Nil @v.to_s(io) end getter v : Int64 delegate to_i, to: @v def ==(r : self) @v == r.v end def ==(r : Int) @v == (r % @@mod) end def - : self m(-@v) end def +(r : self) m(@v + r.v) end def +(r : Int) self + m(r) end def -(r : self) m(@v - r.v) end def -(r : Int) self - m(r) end def *(r : self) m(@v * r.v) end def *(r : Int) self * m(r) end def //(r : self) self * r.inv end def //(r : Int) self // m(r) end def **(n : Int) powr(self, n) end def inv m(ext_gcd(@v.to_i32, @@mod)[1]) end private def m(v : Int) self.class.new(v) end end struct Mint < ModInt; @@mod : Int32 = 10**9+7; end class ProconIO def initialize @buf = [] of String @index = 0 end def get(k : T.class = Int32) forall T get_v(k) end def get(*ks : T.class) forall T ks.map { |k| get_v(k) } end macro define_getn {% for i in (2..9) %} def get{{i}}(k : T.class = Int32) forall T get({% for j in (1..i) %}k{% if j < i %}, {% end %}{% end %}) end {% end %} end define_getn def get_a(n : Int, k : T.class = Int32) forall T Array.new(n) { get_v(k) } end def get_c(n : Int, k : T.class = Int32) forall T get_a(n, k) end def get_c(n : Int, *ks : T.class) forall T a = Array.new(n) { get(*ks) } ks.map_with_index { |_, i| a.map { |e| e[i] } } end macro define_getn_c {% for i in (2..9) %} def get{{i}}_c(n : Int, k : T.class = Int32) forall T get_c(n, {% for j in (1..i) %}k{% if j < i %}, {% end %}{% end %}) end {% end %} end define_getn_c def get_m(r : Int, c : Int, k : T.class = Int32) forall T Array.new(r) { get_a(c, k) } end def put(*vs) vs.each.with_index do |v, i| put_v(v) print i < vs.size - 1 ? " " : "\n" end end def put_e(*vs) put(*vs) exit end private def get_v(k : Int32.class); get_token.to_i32; end private def get_v(k : Int64.class); get_token.to_i64; end private def get_v(k : String.class); get_token; end private def get_token if @buf.size == @index @buf = read_line.split @index = 0 end v = @buf[@index] @index += 1 v end private def put_v(vs : Enumerable) vs.each_with_index do |v, i| print v print " " if i < vs.size - 1 end end private def put_v(v) print v end end main(ProconIO.new)