답안 #633683

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
633683 2022-08-23T04:07:07 Z 406 Party (INOI20_party) C++17
23 / 100
2464 ms 600 KB
#include <bits/stdc++.h>
using ll = long long;
using namespace std;

#define forn(a, b) for (int a = 0; a < (b); a++)
#define rofn(a, b) for (int a = (b) - 1; a >= 0; a--)
#define LOG(a) (63 - __builtin_clzll(a))
#define chmx(a, b) a = max(a, b)
#define chmn(a, b) a = min(a, b)
#define pb push_back
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1,*p2;

inline int read() {
	int x = 0, f = 1; char c;
	while(!isdigit(c = gc())) if(c=='-') f=-1;
	while(isdigit(c)) x = (x<<3)+(x<<1)+(c^48), c = gc();
	return x * f;
}
const ll INFL = 1ll << 60;
const int INF = 1 << 29;
const int N = 62;
const int M = 2 * N;
const int MOD = 1e9 + 7;

ll d[2][M][M], ptr, q, ans, n;

ll pw(ll a, ll b) {
    b %= (MOD - 1);
    a %= MOD;

    ll re = 1;
    while (b) {
        if (b & 1)
            re = (re * a) % MOD;
        a = (a * a) % MOD;
        b /= 2;
    }
    return re;
}

void calc_dist(ll v, ll sub, int lg) {
    for (int k = lg; k < 62; k++) {
        int x = k - lg;
        if ((x + lg) > 62 || (v << x) > n)
            d[1][ptr][x] = 0;
        else
            d[1][ptr][x] = min(n - (v << x) + 1, ((ll)1 << x));
    }
    if (v > 1) {
        for (int k = 2; k < N + 2; k++)
            d[0][ptr][k] -= d[1][ptr][k - 2];
    }
}

void pass() {
    for (int k = 1; k < M; k++)
        d[0][ptr + 1][k] = d[0][ptr][k - 1] + d[1][ptr][k - 1];
    ptr++;
}

void Complete(ll v, ll sub, int lg) {
    if (v > n) {
        ptr--;
        return;
    }
    //cout << "C: " << v << ' ' << sub << " PTR: " << ptr << '\n';
    calc_dist(v, sub, lg);

    pass();
    Complete(v << 1, sub >> 1, lg + 1);
    q <<= 1;
    if (q >= MOD)
        q -= MOD;

    ll s = 0;
    for (int k = 0; k < M; k++) {
        if (!d[0][ptr][k] && !d[1][ptr][k])
            continue;
        s += d[0][ptr][k] + d[1][ptr][k];
        ll t = pw(2, d[0][ptr][k] + d[1][ptr][k]) - 1;

        q += (k * t % MOD) * pw(2, n - s) % MOD;
        if (q >= MOD)
            q -= MOD;
    }
    ptr--;
}

void F(ll v, ll sub, int lg) {
    if (v > n) {
        ptr--;
        return;
    }
    //cout << "F: " << v << ' ' << sub << " PTR: " << ptr << '\n';
    calc_dist(v, sub, lg);

    ll r = (v << 1) | 1;
    ll l = (v << 1);
    int cntr = 0, cntl = 0;
    
    while (r <= n)
        r <<= 1, cntr++;
    while (l <= n)
        l <<= 1, cntl++;

    if (cntr == cntl) {
        q = 0;
        pass();
        Complete(v << 1, (1ll << cntl) - 1, lg + 1);
        ans += q;
        ans %= MOD;

        pass();
        F((v << 1) | 1, sub - (1ll << cntl), lg + 1);
    }
    else {
        q = 0;
        pass();
        Complete((v << 1) | 1, (1ll << cntr) - 1,lg + 1);

        ans += q;
        if (ans >= MOD)
            ans -= MOD;

        pass();
        F((v << 1), sub - (1ll << cntr), lg + 1);
    }
    

    ll s = 0;
    for (int k = 0; k < M; k++) {
        s += d[0][ptr][k] + d[1][ptr][k];
        ll t = pw(2, d[0][ptr][k] + d[1][ptr][k]) - 1;
        ans += k * t % MOD * pw(2, n - s) % MOD;
        if (ans >= MOD)
            ans -= MOD;
    }
    ptr--;
}

signed main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int query;
    cin >> query;
    while (query--) {
        cin >> n;

        Complete(1, n, 1);
        ll re = pw(2, n) - 1;
        ans = q;

        ans = (ans * pw(re, MOD - 2)) % MOD;
        cout << ans << '\n';

        ans = q = ptr = 0;
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 436 KB Output is correct
2 Correct 92 ms 436 KB Output is correct
3 Correct 78 ms 428 KB Output is correct
4 Correct 75 ms 420 KB Output is correct
5 Correct 87 ms 428 KB Output is correct
6 Correct 81 ms 432 KB Output is correct
7 Correct 74 ms 420 KB Output is correct
8 Correct 81 ms 424 KB Output is correct
9 Correct 80 ms 432 KB Output is correct
10 Correct 84 ms 420 KB Output is correct
11 Correct 2443 ms 440 KB Output is correct
12 Correct 2439 ms 480 KB Output is correct
13 Correct 2448 ms 472 KB Output is correct
14 Correct 2422 ms 484 KB Output is correct
15 Correct 2464 ms 484 KB Output is correct
16 Correct 2436 ms 592 KB Output is correct
17 Correct 2452 ms 480 KB Output is correct
18 Correct 2430 ms 480 KB Output is correct
19 Correct 2440 ms 476 KB Output is correct
20 Correct 2436 ms 600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 78 ms 420 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -