智乃的二进制
题号:NC310358
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}智乃定义一个十进制正整数是“好”的,当且仅当其十进制表示中包含数字 01,且数字 1 的出现次数不超过 2。其十进制表示对应的字符串是其二进制表示对应的字符串的一个后缀
\hspace{15pt}例如:101(10进制),其中只有 2 个数位为 1,转写成二进制为 1100101(2进制),其二进制包含后缀 101,就说它是“好”的。
\hspace{15pt}9 个“好”数分别为:11011100101110100010011100

\hspace{15pt}现在智乃想要知道,从小到大排列后的第 k 个符合条件的“好”数是多少。由于答案可能很大,请将答案对 (10^9+7) 取模后输出。

【名词解释】
\hspace{15pt}字符串的后缀:从字符串的最后一个字符开始,向前连续取若干个字符得到的字符串。更具体地,字符串 si 个字符构成的字符串被称为 s 的第 i 个后缀,也记为 s[n-i+1..n]

输入描述:

\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leq T\leq 10^4\right) 代表数据组数,每组测试数据描述如下:

\hspace{15pt}输入一个正整数 k\left(1\leq k \leq 10^{18}\right),表示要查询的第 k 个“好”数。

输出描述:

\hspace{15pt}对于每一组测试数据,新起一行输出一个整数,表示答案对 (10^9+7) 取模后的结果。
示例1

输入

复制
10
1
2
3
4
5
6
7
8
9
114514

输出

复制
1
10
11
100
101
110
1000
1001
1100
722497934

说明

\hspace{15pt}注意第 9 个符合条件的数字不是 1010,因为 1010 的二进制表示为 1111110010,不符合条件。