public class Euler743 {
    static final long kMod = 1000000007L;

    static long modMul(long a, long b) {
        return (a * b) % kMod;
    }

    static long modPow(long base, long exp) {
        long result = 1L;
        while (exp > 0L) {
            if ((exp & 1L) != 0L) {
                result = modMul(result, base);
            }
            base = modMul(base, base);
            exp >>= 1L;
        }
        return result;
    }

    public static String solve() {
        long k = 100000000L;
        long n = 10000000000000000L;

        long q = n / k;
        long b = modPow(2L, q);

        long term = modPow(b, k);
        long answer = term;

        long invB = modPow(b, kMod - 2L);
        long invB2 = modMul(invB, invB);

        int half = (int) (k / 2L);
        int[] inverses = new int[half + 1];
        if (half >= 1) {
            inverses[1] = 1;
        }
        for (int i = 2; i <= half; ++i) {
            inverses[i] = (int) (kMod - modMul(kMod / i, inverses[(int) (kMod % i)]));
        }

        long num1 = k % kMod;
        long num2 = (k + kMod - 1L) % kMod;

        for (int x = 1; x <= half; ++x) {
            long invX = inverses[x];

            term = modMul(term, num1);
            term = modMul(term, num2);
            term = modMul(term, invX);
            term = modMul(term, invX);
            term = modMul(term, invB2);

            answer += term;
            if (answer >= kMod) {
                answer -= kMod;
            }

            num1 += kMod - 2L;
            if (num1 >= kMod)
                num1 -= kMod;

            num2 += kMod - 2L;
            if (num2 >= kMod)
                num2 -= kMod;
        }

        return Long.toString(answer);
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
