29 lines
836 B
C++
29 lines
836 B
C++
#include <stdio.h>
|
|
#include <iostream>
|
|
#include <stdint.h>
|
|
|
|
uint64_t ceil_div_pow2(uint64_t a, uint64_t m) {
|
|
if (m == 0 || a == 0) return a;
|
|
if (m >= 64) return 1;
|
|
// ceil(a / (2^m)) = floor(a + 2^m - 1) / (2^m),这个方法可以把奇偶写在一起。
|
|
__uint128_t num = (__uint128_t)a + ((__uint128_t)1 << m) - 1;
|
|
return (uint64_t)(num >> m);
|
|
}
|
|
|
|
int main() {
|
|
int T;
|
|
uint32_t x, n, m;
|
|
scanf("%d", &T);
|
|
for (int _ = 0; _ < T; _++) {
|
|
scanf("%d %d %d", &x, &n, &m);
|
|
uint64_t min_ans = ceil_div_pow2(x, m);
|
|
min_ans = (n >= 64) ? 0 : (min_ans >> n);
|
|
|
|
uint64_t max_ans = (n >= 64) ? 0 : (x >> n);
|
|
max_ans = ceil_div_pow2(max_ans, m);
|
|
|
|
// printf("%llu %llu\n", min_ans, max_ans);
|
|
std::cout << min_ans << ' ' << max_ans << "\n";
|
|
}
|
|
return 0;
|
|
} |