#include #include #include 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; }