QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#137052#241. Chiaki Sequence Revisitedpssxx100 ✓170ms3428kbC++204.2kb2023-08-09 17:41:532023-08-09 17:41:56

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-08-09 17:41:56]
  • 评测
  • 测评结果:100
  • 用时:170ms
  • 内存:3428kb
  • [2023-08-09 17:41:53]
  • 提交

answer

// #include<bits/stdc++.h>
// using namespace std;
// #define INF 0x3f3f3f3f
// #define PI acos(-1)
// #define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
// #define mem(a,b) memset((a),(b),sizeof(a))
// typedef long long ll;
// typedef unsigned long long ull;
// #define int long long
// #define db long double

// const double eps = 1e-6;
// const int mod = 1e9 + 7;
// const int maxn = 1e5 + 10;

// int a[maxn], pow2[100];

// int lowbit(int x) {
//     return x & (-x);
// }

// void init() {
//     pow2[0] = 1;
//     for(int i = 1; i <= 63; i++) {
//         pow2[i] = pow2[i - 1] * 2;
//     }
// }

// int n, ans;
// int cnt[100];
// int pos = 0;

// bool check(int x) {
//     int now = 1, pre = 0;
//     for (int i = pos; i >= 0; i--) {
//         cnt[i] = (x / pow2[i] - pre);
//         now += (i + 1) * (x / pow2[i] - pre);
//         pre += cnt[i];
//     }
//     if (now >= n) {
//         return false;
//     } else {
//         return true;
//     }
// }

// void solve() {
//     cin >> n;
//     int l = 1, r = n;
//     pos = 0;
//     int now = n;
//     while(now != 0) {
//         pos++;
//         now /= 2;
//     }
//     while (l <= r) {
//         int mid = (l + r) >> 1;
//         if (check(mid)) {
//             l = mid + 1;
//         } else {
//             r = mid - 1;
//         }
//     }
//     int an = l - 1;
//     int ans = 1;
//     int pre = 1;
//     int inv = (1000000000 + 8) / 2;
//     for(int i = 0; i <= pos - 1; i++) {
//         int cnt1 = 0;
//         if(pos < 63) cnt1 = (an + 1) / pow2[i] - (an + 1) / pow2[i + 1];
//         else cnt1 = (an + 1) / pow2[i];
//         int beg = pow2[i] % mod;
//         int end = (((cnt1 - 1) % mod * pow2[i] % mod * 2 % mod) % mod + pow2[i]) % mod;
//         ans = (ans + (i + 1) * ((beg + end) * cnt1 * inv % mod) % mod) % mod;
//         pre += cnt1 * (i + 1);
//     }
//     ans = (ans - ((pre - n) * ((an % mod + 1) % mod)) % mod + mod) % mod;
//     cout << ans << '\n';
// }

// signed main(){
//     io;
//     init();
//     int T = 1;
//     // T = read();
//     cin >> T;
//     while(T--) {
//         solve();
//     }
//     return 0;
// }
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define mem(a,b) memset((a),(b),sizeof(a))
typedef long long ll;
typedef unsigned long long ull;
#define int long long
#define db long double

const double eps = 1e-6;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 10;

int a[maxn], pow2[100];

int lowbit(int x) {
    return x & (-x);
}

void init() {
    pow2[0] = 1;
    for(int i = 1; i <= 63; i++) {
        pow2[i] = pow2[i - 1] * 2;
    }
}

int n, ans;
int cnt[100];
int pos = 0;
int inv = (1000000000 + 8) / 2;

int check(int x) {
    int num = 1;
    while(x) {
        num += x;
        x /= 2;
    }
    return num;
}

void solve() {
    cin >> n;
    int l = 1, r = n;
    pos = 0;
    int now = n;
    while(now != 0) {
        pos++;
        now /= 2;
    }
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (check(mid) <= n) {
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    int an = l - 1;
    int ans = 1;
    // for(int i = 0; i <= pos; i++) {
    //     int cnt1 = 0;
    //     if(pos != 63) cnt1 = (an + 1) / pow2[i] - (an + 1) / pow2[i + 1];
    //     else cnt1 = (an + 1) / pow2[i];
    //     int beg = pow2[i] % mod;
    //     int end = (((cnt1 - 1) % mod * pow2[i] % mod * 2 % mod) + pow2[i] % mod) % mod;
    //     ans = (ans + (i + 1) % mod * (((beg + end) % mod * inv) % mod * cnt1) % mod) % mod;
    //     pre += cnt1 * (i + 1);
    // }
    int t = an, base = 1;
    while (t)
    {
        ans += t % mod * ((t + 1) % mod) % mod * inv % mod * base % mod;
        t /= 2;
        base = base * 2ll % mod;
    }
    int pre = check(an);
    ans = (ans + ((n - pre) % mod * (an + 1) % mod) % mod) % mod;
    cout << ans << '\n';
}

signed main(){
    io;
    init();
    int T = 1;
    // T = read();
    cin >> T;
    while(T--) {
        solve();
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 170ms
memory: 3428kb

input:

100000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
1...

output:

1
2
4
6
9
13
17
21
26
32
38
45
53
61
69
77
86
96
106
117
129
141
153
166
180
194
209
225
241
257
273
289
306
324
342
361
381
401
421
442
464
486
509
533
557
581
605
630
656
682
709
737
765
793
822
852
882
913
945
977
1009
1041
1073
1105
1138
1172
1206
1241
1277
1313
1349
1386
1424
1462
1501
1541
158...

result:

ok 100000 lines