Submission #633680

# Submission time Handle Problem Language Result Execution time Memory
633680 2022-08-23T03:52:50 Z 406 Party (INOI20_party) C++17
7 / 100
3000 ms 540 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 = 122;
const int MOD = 1e9 + 7;

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

ll pw(ll a, ll b) {
    assert(b >= 0);
    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)
            break;
        d[1][ptr][x] = min(n - (v << x) + 1, ((ll)1 << x));
    }
    if (v > 1) {
        for (int k = 2; k < N; k++)
            d[0][ptr][k] -= d[1][ptr][k - 2];
    }
}

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

void clear() {
    for (int b = 0; b < 2; b++)
        for (int i = 0; i < N; i++)
            d[b][ptr][i] = 0;
    ptr--;
}

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

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

    ll s = 0;
    for (int k = 0; k < N; 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;
    }
    clear();
}

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

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

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

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

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

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

    ll s = 0;
    for (int k = 0; k < N; 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;
    }
    clear();
}

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

        F(1, n, 1);
        ll re = pw(2, n) - 1;

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

        ans = q = ptr = 0;
    }
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 340 KB Output is correct
2 Correct 3 ms 340 KB Output is correct
3 Correct 3 ms 340 KB Output is correct
4 Correct 3 ms 340 KB Output is correct
5 Correct 4 ms 340 KB Output is correct
6 Correct 3 ms 340 KB Output is correct
7 Correct 4 ms 340 KB Output is correct
8 Correct 3 ms 212 KB Output is correct
9 Correct 2 ms 340 KB Output is correct
10 Correct 3 ms 340 KB Output is correct
11 Correct 58 ms 348 KB Output is correct
12 Correct 63 ms 348 KB Output is correct
13 Correct 56 ms 344 KB Output is correct
14 Correct 56 ms 352 KB Output is correct
15 Correct 58 ms 344 KB Output is correct
16 Correct 58 ms 348 KB Output is correct
17 Correct 58 ms 472 KB Output is correct
18 Correct 53 ms 340 KB Output is correct
19 Correct 53 ms 468 KB Output is correct
20 Correct 54 ms 352 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1942 ms 428 KB Output is correct
2 Correct 2272 ms 424 KB Output is correct
3 Correct 2017 ms 416 KB Output is correct
4 Correct 1733 ms 520 KB Output is correct
5 Correct 2092 ms 424 KB Output is correct
6 Correct 2036 ms 424 KB Output is correct
7 Correct 1865 ms 424 KB Output is correct
8 Correct 1947 ms 424 KB Output is correct
9 Correct 1876 ms 428 KB Output is correct
10 Correct 2027 ms 424 KB Output is correct
11 Execution timed out 3091 ms 340 KB Time limit exceeded
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1825 ms 540 KB Output is correct
2 Correct 2051 ms 424 KB Output is correct
3 Correct 1766 ms 468 KB Output is correct
4 Correct 1809 ms 416 KB Output is correct
5 Correct 2091 ms 432 KB Output is correct
6 Correct 2033 ms 424 KB Output is correct
7 Correct 1980 ms 464 KB Output is correct
8 Correct 2126 ms 424 KB Output is correct
9 Correct 1931 ms 420 KB Output is correct
10 Correct 2129 ms 428 KB Output is correct
11 Execution timed out 3063 ms 340 KB Time limit exceeded
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 340 KB Output is correct
2 Correct 3 ms 340 KB Output is correct
3 Correct 3 ms 340 KB Output is correct
4 Correct 3 ms 340 KB Output is correct
5 Correct 4 ms 340 KB Output is correct
6 Correct 3 ms 340 KB Output is correct
7 Correct 4 ms 340 KB Output is correct
8 Correct 3 ms 212 KB Output is correct
9 Correct 2 ms 340 KB Output is correct
10 Correct 3 ms 340 KB Output is correct
11 Correct 58 ms 348 KB Output is correct
12 Correct 63 ms 348 KB Output is correct
13 Correct 56 ms 344 KB Output is correct
14 Correct 56 ms 352 KB Output is correct
15 Correct 58 ms 344 KB Output is correct
16 Correct 58 ms 348 KB Output is correct
17 Correct 58 ms 472 KB Output is correct
18 Correct 53 ms 340 KB Output is correct
19 Correct 53 ms 468 KB Output is correct
20 Correct 54 ms 352 KB Output is correct
21 Correct 1942 ms 428 KB Output is correct
22 Correct 2272 ms 424 KB Output is correct
23 Correct 2017 ms 416 KB Output is correct
24 Correct 1733 ms 520 KB Output is correct
25 Correct 2092 ms 424 KB Output is correct
26 Correct 2036 ms 424 KB Output is correct
27 Correct 1865 ms 424 KB Output is correct
28 Correct 1947 ms 424 KB Output is correct
29 Correct 1876 ms 428 KB Output is correct
30 Correct 2027 ms 424 KB Output is correct
31 Execution timed out 3091 ms 340 KB Time limit exceeded
32 Halted 0 ms 0 KB -