답안 #760126

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
760126 2023-06-17T08:12:55 Z The_Samurai Party (INOI20_party) C++17
0 / 100
3000 ms 212 KB
#include "bits/stdc++.h"

using namespace std;
using ll = long long;

const ll mod = 1e9 + 7;

ll binpow(ll a, ll b, ll mod, bool dec = false) {
    ll ans = 1;
    while (b) {
        if (b & 1) {
            ans = ans * a % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    if (dec) {
        ans = (ans - 1 + mod) % mod;
    }
    return ans;
}

bool isTwo(ll n) {
    return (1ll << (63 - __builtin_clzll(n))) == n;
}

ll n, ans;

void calc(ll x, ll mul) {
    vector<tuple<ll, ll, bool>> g = {{x, 1, true}};
    ll others = n, sum_all = 0;
    for (int h = 0; h <= n; h++) {
        vector<tuple<ll, ll, bool>> nw;
        ll sum = 0;
        for (auto [v, t, change]: g) {
            sum += t;
            if (!change) {
                if (v * 2 <= n) {
                    nw.emplace_back(v * 2, t * 2, change);
                }
                continue;
            }
            if (x == v) {
                if (v * 2 <= n) {
                    nw.emplace_back(v * 2, t * 2, false);
                }
                if (v > 1) {
                    nw.emplace_back(v / 2, 1, true);
                }
                continue;
            }
            if (isTwo(x / v) and x % v == 0) {
                if (v * 2 + 1 <= n) {
                    nw.emplace_back(v * 2 + 1, 1, false);
                }
                if (v > 1) {
                    nw.emplace_back(v / 2, 1, true);
                }
                continue;
            }
        }
//        cout << x << ' ' << h << '\t';
//        for (auto [v, t, change]: g) {
//            cout << v << " -> " << t << "  ";
//        }
//        cout << endl;
        others -= sum;
        ll k = binpow(2, sum, mod, true) * binpow(2, others, mod) % mod;
        sum_all = (sum_all + k * h % mod * mul) % mod;
        if (nw.empty()) {
            break;
        }
        g = nw;
    }
    ans = (ans + sum_all) % mod;
}

int main() {
    int q;
    cin >> q;
    for (int qq = 1; qq <= q; qq++) {
        cin >> n;
        ans = 0;
        for (ll x = 1; x < n; x *= 2) {
            calc(x, x);
        }
#ifdef sunnitov
        cout << ans << ' ';
#endif
        cout << ans * binpow(binpow(2, n % mod, mod, true), mod - 2, mod) % mod << '\n';
    }
}

// 1 - 1 2 4 8
// 2 - 1 3 8 2 4
// 4 - 1 3 2 3 2 4
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3070 ms 212 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 139 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3075 ms 212 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3070 ms 212 KB Time limit exceeded
2 Halted 0 ms 0 KB -