Submission #760152

# Submission time Handle Problem Language Result Execution time Memory
760152 2023-06-17T08:36:10 Z The_Samurai Party (INOI20_party) C++17
0 / 100
3000 ms 328 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;
        if (nw.empty()) {
            break;
        }
        g = nw;
    }
    mul %= mod;
    ans = (ans + sum_all * mul) % mod;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    int q;
    cin >> q;
    for (int qq = 1; qq <= q; qq++) {
        cin >> n;
//        n = (1ll << qq) - 1;
        ans = 0;
        for (ll x = 1; x < n; x *= 2) {
            calc(x, x);
        }
//#ifdef sunnitov
//        cout << n << ' ' << ans << ' ';
//#endif
        cout << ans * binpow(binpow(2, n, mod, true), mod - 2, mod) % mod << '\n';
    }
}
# Verdict Execution time Memory Grader output
1 Execution timed out 3072 ms 212 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 133 ms 212 KB Output is correct
2 Correct 153 ms 308 KB Output is correct
3 Correct 135 ms 212 KB Output is correct
4 Correct 119 ms 308 KB Output is correct
5 Correct 141 ms 308 KB Output is correct
6 Correct 137 ms 312 KB Output is correct
7 Correct 133 ms 312 KB Output is correct
8 Correct 136 ms 328 KB Output is correct
9 Correct 127 ms 312 KB Output is correct
10 Correct 136 ms 312 KB Output is correct
11 Execution timed out 3094 ms 324 KB Time limit exceeded
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3074 ms 212 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3072 ms 212 KB Time limit exceeded
2 Halted 0 ms 0 KB -