B. Special Numbers- Codeforces Round #747 (Div. 2)

原题链接 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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦三码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值