CF1242D Number Discovery

题目描述

Ujan 需要从打扫中休息一下,于是他开始玩无限序列。他有两个整数 $n$ 和 $k$。他通过重复以下步骤来构造一个无限序列 $s$。 1. 找到 $k$ 个当前未出现在 $s$ 中的最小不同正整数,记为 $u_{1}, u_{2}, \ldots, u_{k}$,并按从小到大排序。 2. 依次将 $u_{1}, u_{2}, \ldots, u_{k}$ 以及 $ \sum_{i=1}^{k} u_{i} $ 添加到 $s$ 的末尾。 3. 回到第一步。 当 Ujan 在序列 $s$ 中写下数字 $n$ 时,他就会停止拖延。请你帮他找到 $n$ 在序列 $s$ 中的下标。换句话说,找到一个整数 $x$,使得 $s_{x} = n$。可以证明,所有正整数都只会在 $s$ 中出现一次。

输入格式

第一行包含一个整数 $t$($1 \le t \le 10^{5}$),表示测试用例的数量。 接下来的 $t$ 行,每行包含两个整数 $n$ 和 $k$($1 \le n \le 10^{18}$,$2 \le k \le 10^{6}$),分别表示要在序列 $s$ 中查找的数字和构造序列 $s$ 时使用的参数。

输出格式

对于每个测试用例,输出一行答案,表示对应数字 $n$ 在序列 $s$ 中的下标。

说明/提示

在第一个样例中,$s = (1, 2, 3, 4, 5, 9, 6, 7, 13, 8, 10, 18, \ldots)$。$10$ 是序列中的第 $11$ 个数,所以答案是 $11$。 在第二个样例中,$s = (1, 2, 3, 4, 5, 15, 6, 7, 8, 9, 10, 40, \ldots)$。 由 ChatGPT 4.1 翻译