原题链接 https://codeforces.com/contest/1594/problem/B
B. Special Numbers
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Theofanis really likes sequences of positive integers, thus his teacher (Yeltsa Kcir) gave him a problem about a sequence that consists of only special numbers.
Let's call a positive number special if it can be written as a sum of different non-negative powers of nn. For example, for n=4n=4 number 1717 is special, because it can be written as 40+42=1+16=1740+42=1+16=17, but 99 is not.
Theofanis asks you to help him find the kk-th special number if they are sorted in increasing order. Since this number may be too large, output it modulo 109+7109+7.
Input
The first line contains a single integer tt (1≤t≤1041≤t≤104) — the number of test cases.
The first and only line of each test case contains two integers nn and kk (2≤n≤1092≤n≤109; 1≤k≤1091≤k≤109).
Output
For each test case, print one integer — the kk-th special number in increasing order modulo 109+7109+7.
Example
input
Copy
3 3 4 2 12 105 564
output
Copy
9 12 3595374
Note
For n=3n=3 the sequence is [1,3,4,9...]
----------------------------------------------------------------------------------------------------------
考察二进制与数论的应用,
根据这一结论,以2为例
2^0 <2^1 <2^0 +2^1 < 2^2 < 2^2+2^0 < 2^2+2^1 < 2^2+2^1+2^0 < 2^3
把指数提取,用二进制表示,0代表这一位不选,1代表选择,
次幂和 二进制 十进制
2^0 1 1
2^1 10 2
2^0 +2^1 11 3
2^2 100 4
2^2+2^0 101
5
可以看出,把这些二进制转换成十进制,正好是他们大小顺序;
也就可以推得,对于特定大小的,比如第五小的, 把5转换成二进制 101
,提取二进制每一位,是1就选,也就得出了这个数
但我们是以2举例,以2为底数,题目要求任意n,不难发现把n替换2,大小关系仍然成立;
关于提取二进制每一位采用按位与&,(1<<i)只有最高位是1,其余全是0,按位与要求两者必须全是1才得出1;
# include<iostream>
using namespace std;
typedef long long int ll;
ll mod=1e9+7;
int main ()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
ll ans=0,pow=1;
for(int i=0; i<=31; i++)
{
if(k&(1<<i))
ans=(ans+pow)%mod;
pow=pow*(ll)n%mod;
}
cout<<ans%mod<<'\n';
}
return 0;
}