# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
635472 |
2022-08-26T10:05:08 Z |
Cyanmond |
Party (INOI20_party) |
C++17 |
|
3000 ms |
3776 KB |
#include <bits/stdc++.h>
using i64 = long long;
constexpr i64 mod = 1000000007;
i64 nmr(i64 a) {
a %= mod;
if (a < 0) a += mod;
return a;
}
i64 add(i64 a, i64 b) {
a += b;
if (a > mod) a -= mod;
return a;
}
i64 mul(i64 a, i64 b) { return a * b % mod; }
void add_m(i64 &a, i64 b) { a = add(a, b); }
void mul_m(i64 &a, i64 b) { a = mul(a, b); }
i64 inv(i64 x) {
i64 a = x, b = mod, u = 1, v = 0, t = 0;
while (b > 0) {
t = a / b;
a -= t * b;
u -= t * v;
std::swap(a, b);
std::swap(u, v);
}
return nmr(u);
}
std::array<i64, 100> p2m;
void init_p2() {
p2m[0] = 2;
for (int i = 0; i < 90; ++i) p2m[i + 1] = mul(p2m[i], p2m[i]);
}
std::unordered_map<i64, i64> p2memo;
i64 pow2(i64 n) {
if (p2memo.find(n) != p2memo.end()) return p2memo[n];
i64 n2 = n;
i64 ret = 1;
int i = 0;
while (n != 0) {
if (n & 1) mul_m(ret, p2m[i]);
++i;
n >>= 1;
}
return p2memo[n2] = ret;
}
void solve() {
// Time Complexity O(log^4 N)
i64 N;
std::cin >> N;
// N = 2 ^ k - 1
i64 k = 0;
while ((1ll << k) - 1 < N) ++k;
// assert((1ll << k) - 1 == N);
std::vector<i64> red_vs = {N};
while (red_vs.back() != 1) {
red_vs.push_back(red_vs.back() / 2);
}
std::reverse(red_vs.begin(), red_vs.end());
std::vector<std::vector<i64>> red_count_vs(k);
for (int i = k - 1; i >= 0; --i) {
red_count_vs[i].assign(k - i, 0);
red_count_vs[i][0] = 1;
for (int j = 1; j < k - i; ++j) red_count_vs[i][j] += red_count_vs[i + 1][j - 1];
if (i != k - 1 and red_vs[i + 1] == 2 * red_vs[i] + 1) {
for (int j = 1; j < k - i; ++j) red_count_vs[i][j] += 1ll << (j - 1);
} else {
for (int j = 1; j < k - i - 1; ++j) red_count_vs[i][j] += 1ll << (j - 1);
}
}
// sa0te
auto dfs = [&](auto &&self, const int d, const i64 v) -> i64 {
if (v > N) return 0;
i64 ret = 0;
if (red_vs[d] == v) {
// rec
add_m(ret, self(self, d + 1, 2 * v));
add_m(ret, self(self, d + 1, 2 * v + 1));
i64 sum = 0;
for (int u = 0; u <= 2 * k; ++u) {
i64 count_v = 0;
for (i64 p = 0; p <= u; ++p) {
const i64 now_d = d - p;
if (now_d < 0) continue;
const i64 t = u - p;
if (now_d + t >= k) continue;
if (t == 0) ++count_v;
else {
if (p == 0) count_v += red_count_vs[now_d][t];
else count_v += red_count_vs[now_d][t] - red_count_vs[now_d + 1][t - 1];
}
}
if (count_v == 0) continue;
add_m(ret, mul(u, add(pow2(N - sum), mod - pow2(N - sum - count_v))));
sum += count_v;
}
} else {
// no rec
i64 v2 = v;
for (int fd = d; fd < k; ++fd) {
if (v * (1ll << (fd - d)) > N) continue;
const i64 ms = nmr(1ll << (fd - d));
i64 sum = 0;
for (int u = 0; u <= fd + k; ++u) {
i64 count_v = 0;
bool h = false;
for (int p = 0; p <= std::min(u, fd); ++p) {
const int now_d = fd - p;
bool th = false;
if (red_vs[now_d] == v2 / (1ll << p)) th = true;
const int t = u - p;
if (now_d + t >= k) {
if (th) h = true;
continue;
}
if (th) {
if (t == 0) ++count_v;
else {
if (h) count_v += red_count_vs[now_d][t] - red_count_vs[now_d + 1][t - 1];
else count_v += red_count_vs[now_d + 1][t - 1];
}
h = true;
} else {
if (v % 2 == 1 and now_d + t == k - 1) continue;
count_v += 1ll << (p != 0 and t != 0 ? t - 1 : t);
}
}
if (count_v == 0) continue;
add_m(ret, mul(mul(ms, u), add(pow2(N - sum), mod - pow2(N - sum - count_v))));
sum += count_v;
}
v2 *= 2;
}
}
return ret;
};
const auto res = dfs(dfs, 0, 1);
std::cout << nmr(res * inv(add(pow2(N), mod - 1))) << std::endl;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
init_p2();
int Q;
std::cin >> Q;
while (Q--) solve();
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
212 KB |
Output is correct |
2 |
Correct |
2 ms |
212 KB |
Output is correct |
3 |
Correct |
2 ms |
212 KB |
Output is correct |
4 |
Correct |
2 ms |
212 KB |
Output is correct |
5 |
Correct |
2 ms |
212 KB |
Output is correct |
6 |
Correct |
2 ms |
212 KB |
Output is correct |
7 |
Correct |
2 ms |
212 KB |
Output is correct |
8 |
Correct |
4 ms |
316 KB |
Output is correct |
9 |
Correct |
2 ms |
316 KB |
Output is correct |
10 |
Correct |
2 ms |
212 KB |
Output is correct |
11 |
Correct |
36 ms |
340 KB |
Output is correct |
12 |
Correct |
35 ms |
336 KB |
Output is correct |
13 |
Correct |
33 ms |
340 KB |
Output is correct |
14 |
Correct |
32 ms |
332 KB |
Output is correct |
15 |
Correct |
33 ms |
348 KB |
Output is correct |
16 |
Correct |
42 ms |
336 KB |
Output is correct |
17 |
Correct |
34 ms |
340 KB |
Output is correct |
18 |
Correct |
36 ms |
328 KB |
Output is correct |
19 |
Correct |
37 ms |
336 KB |
Output is correct |
20 |
Correct |
36 ms |
212 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2390 ms |
1068 KB |
Output is correct |
2 |
Correct |
2889 ms |
1216 KB |
Output is correct |
3 |
Correct |
2525 ms |
1272 KB |
Output is correct |
4 |
Correct |
2084 ms |
1224 KB |
Output is correct |
5 |
Correct |
2676 ms |
1344 KB |
Output is correct |
6 |
Correct |
2709 ms |
1128 KB |
Output is correct |
7 |
Correct |
2345 ms |
1288 KB |
Output is correct |
8 |
Correct |
2358 ms |
1216 KB |
Output is correct |
9 |
Correct |
2266 ms |
1144 KB |
Output is correct |
10 |
Correct |
2491 ms |
1072 KB |
Output is correct |
11 |
Execution timed out |
3068 ms |
400 KB |
Time limit exceeded |
12 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2105 ms |
3492 KB |
Output is correct |
2 |
Correct |
2430 ms |
3776 KB |
Output is correct |
3 |
Correct |
2032 ms |
3384 KB |
Output is correct |
4 |
Correct |
2127 ms |
3540 KB |
Output is correct |
5 |
Correct |
2603 ms |
1480 KB |
Output is correct |
6 |
Correct |
2519 ms |
1692 KB |
Output is correct |
7 |
Correct |
2475 ms |
1640 KB |
Output is correct |
8 |
Correct |
2630 ms |
1772 KB |
Output is correct |
9 |
Correct |
2345 ms |
1396 KB |
Output is correct |
10 |
Correct |
2592 ms |
1312 KB |
Output is correct |
11 |
Execution timed out |
3067 ms |
360 KB |
Time limit exceeded |
12 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
212 KB |
Output is correct |
2 |
Correct |
2 ms |
212 KB |
Output is correct |
3 |
Correct |
2 ms |
212 KB |
Output is correct |
4 |
Correct |
2 ms |
212 KB |
Output is correct |
5 |
Correct |
2 ms |
212 KB |
Output is correct |
6 |
Correct |
2 ms |
212 KB |
Output is correct |
7 |
Correct |
2 ms |
212 KB |
Output is correct |
8 |
Correct |
4 ms |
316 KB |
Output is correct |
9 |
Correct |
2 ms |
316 KB |
Output is correct |
10 |
Correct |
2 ms |
212 KB |
Output is correct |
11 |
Correct |
36 ms |
340 KB |
Output is correct |
12 |
Correct |
35 ms |
336 KB |
Output is correct |
13 |
Correct |
33 ms |
340 KB |
Output is correct |
14 |
Correct |
32 ms |
332 KB |
Output is correct |
15 |
Correct |
33 ms |
348 KB |
Output is correct |
16 |
Correct |
42 ms |
336 KB |
Output is correct |
17 |
Correct |
34 ms |
340 KB |
Output is correct |
18 |
Correct |
36 ms |
328 KB |
Output is correct |
19 |
Correct |
37 ms |
336 KB |
Output is correct |
20 |
Correct |
36 ms |
212 KB |
Output is correct |
21 |
Correct |
2390 ms |
1068 KB |
Output is correct |
22 |
Correct |
2889 ms |
1216 KB |
Output is correct |
23 |
Correct |
2525 ms |
1272 KB |
Output is correct |
24 |
Correct |
2084 ms |
1224 KB |
Output is correct |
25 |
Correct |
2676 ms |
1344 KB |
Output is correct |
26 |
Correct |
2709 ms |
1128 KB |
Output is correct |
27 |
Correct |
2345 ms |
1288 KB |
Output is correct |
28 |
Correct |
2358 ms |
1216 KB |
Output is correct |
29 |
Correct |
2266 ms |
1144 KB |
Output is correct |
30 |
Correct |
2491 ms |
1072 KB |
Output is correct |
31 |
Execution timed out |
3068 ms |
400 KB |
Time limit exceeded |
32 |
Halted |
0 ms |
0 KB |
- |