L = [int(i) for i in input()]
l = len(L)


def mod_pow(a, p, mod):
    if p == 0:
        return 1
    elif p % 2 == 1:
        return a * mod_pow(a, p - 1, mod)
    else:
        return (mod_pow(a, p // 2, mod) % mod) ** 2 % mod


# L以下の整数は「上からi桁目まで同じで、それ以降違う」で考える。　あるL以下の整数=A+B
# L[i]=0のときAとBの桁は(0,0), L[i]=1のときAとBの桁は(0,1)(1,0)のどちらか
mod = 10 ** 9 + 7
answer = 0
prev = 1

for i, j in enumerate(L, 1):
    if j == 0:
        continue
    answer += prev * mod_pow(3, l - i, mod)
    answer %= mod
    prev *= 2
    prev %= mod

answer += prev
answer %= mod
print(answer) int(i) for i in input() for i in input() i input() input for i in input() int(i) int i L = [int(i) for i in input()] L [int(i) for i in input()] l = len(L) l len(L) len L def mod_pow(a, p, mod):
    if p == 0:
        return 1
    elif p % 2 == 1:
        return a * mod_pow(a, p - 1, mod)
    else:
        return (mod_pow(a, p // 2, mod) % mod) ** 2 % mod


# L以下の整数は「上からi桁目まで同じで、それ以降違う」で考える。　あるL以下の整数=A+B
# L[i]=0のときAとBの桁は(0,0), L[i]=1のときAとBの桁は(0,1)(1,0)のどちらか mod_pow if p == 0:
        return 1
    elif p % 2 == 1:
        return a * mod_pow(a, p - 1, mod)
    else:
        return (mod_pow(a, p // 2, mod) % mod) ** 2 % mod


# L以下の整数は「上からi桁目まで同じで、それ以降違う」で考える。　あるL以下の整数=A+B
# L[i]=0のときAとBの桁は(0,0), L[i]=1のときAとBの桁は(0,1)(1,0)のどちらか p == 0 p 0 return 1 1 elif p % 2 == 1:
        return a * mod_pow(a, p - 1, mod)
     p % 2 == 1 p % 2 p 2 1 return a * mod_pow(a, p - 1, mod) a * mod_pow(a, p - 1, mod) a mod_pow(a, p - 1, mod) mod_pow a p - 1 p 1 mod return (mod_pow(a, p // 2, mod) % mod) ** 2 % mod (mod_pow(a, p // 2, mod) % mod) ** 2 % mod (mod_pow(a, p // 2, mod) % mod) ** 2 mod_pow(a, p // 2, mod) % mod mod_pow(a, p // 2, mod) mod_pow a p // 2 p 2 mod mod 2 mod a a p p mod mod mod = 10 ** 9 + 7 mod 10 ** 9 + 7 10 ** 9 10 9 7 answer = 0 answer 0 prev = 1 prev 1 for i, j in enumerate(L, 1):
    if j == 0:
        continue
    answer += prev * mod_pow(3, l - i, mod)
    answer %= mod
    prev *= 2
    prev %= mod i j enumerate(L, 1) enumerate L 1 if j == 0:
        continue
     j == 0 j 0 continue answer += prev * mod_pow(3, l - i, mod) answer prev * mod_pow(3, l - i, mod) prev mod_pow(3, l - i, mod) mod_pow 3 l - i l i mod answer %= mod answer mod prev *= 2 prev 2 prev %= mod prev mod answer += prev answer prev answer %= mod answer mod print(answer) print answer answer += prev prev answer answer %= mod mod answer answer += prev * mod_pow(3, l - i, mod) prev * mod_pow(3, l - i, mod) answer prev %= mod mod prev L = [int(i) for i in input()] [int(i) for i in input()] L def mod_pow(a, p, mod):
    if p == 0:
        return 1
    elif p % 2 == 1:
        return a * mod_pow(a, p - 1, mod)
    else:
        return (mod_pow(a, p // 2, mod) % mod) ** 2 % mod


# L以下の整数は「上からi桁目まで同じで、それ以降違う」で考える。　あるL以下の整数=A+B
# L[i]=0のときAとBの桁は(0,0), L[i]=1のときAとBの桁は(0,1)(1,0)のどちらか def mod_pow(a, p, mod):
    if p == 0:
        return 1
    elif p % 2 == 1:
        return a * mod_pow(a, p - 1, mod)
    else:
        return (mod_pow(a, p // 2, mod) % mod) ** 2 % mod


# L以下の整数は「上からi桁目まで同じで、それ以降違う」で考える。　あるL以下の整数=A+B
# L[i]=0のときAとBの桁は(0,0), L[i]=1のときAとBの桁は(0,1)(1,0)のどちらか mod_pow answer = 0 0 answer answer %= mod mod answer l = len(L) len(L) l prev *= 2 2 prev mod = 10 ** 9 + 7 10 ** 9 + 7 mod prev = 1 1 prev
L = [int(i) for i in input()]
l = len(L)


def mod_pow(a, p, mod):
    if p == 0:
        return 1
    elif p % 2 == 1:
        return a * mod_pow(a, p - 1, mod)
    else:
        return (mod_pow(a, p // 2, mod) % mod) ** 2 % mod


# L以下の整数は「上からi桁目まで同じで、それ以降違う」で考える。　あるL以下の整数=A+B
# L[i]=0のときAとBの桁は(0,0), L[i]=1のときAとBの桁は(0,1)(1,0)のどちらか
mod = 10 ** 9 + 7
answer = 0
prev = 1

for i, j in enumerate(L, 1):
    if j == 0:
        continue
    answer += prev * mod_pow(3, l - i, mod)
    answer %= mod
    prev *= 2
    prev %= mod

answer += prev
answer %= mod
print(answer)
