This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using i64 = long long;
constexpr int P = 1000000007;
constexpr i64 inf = 2e18;
int norm(int x) {
    if (x < 0) x += P;
    if (x >= P) x -= P;
    return x;
}
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    i64 n, k;
    std::cin >> n >> k;
    k--;
    
    std::vector<i64> mpw(n + 1, 1), pw(n + 1, 1);
    for (int i = 1; i <= n; i++) {
        mpw[i] = mpw[i - 1] * 2 % P;
        pw[i] = std::min(pw[i - 1] * 2, inf);
    }
    
    int ans = 0;
    for (int i = 0; i < n; i++) {
        if (k >= pw[n - i - 1]) {
            ans = norm(ans + mpw[i]);
            k -= pw[n - i - 1];
        }
    }
    
    std::cout << norm(ans + 1) << "\n";
    
    return 0;
}
/*
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
*/
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |