读题

注意到n的每个次方只会被利用一次,观察样例说明,意识到对于第k个值,这个值的大小为n^0+n^1+...+n^k。

联想到快速幂的过程。(快速幂算法有效性的证明

意识到可以把k进行分解,从二进制的角度观察k的值,发现对于k的每一位,如果第i位为1,则ans+=poww(n,i),否则不进行操作。


#include<cstdio>
#include<iostream>
#define ll long long 
using namespace std;
const int MOD=1e9+7;
ll poww(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1)ans=(ans*a%MOD)%MOD;
        a=a*a%MOD;
        b>>=1;
    }
    return ans;
}
int main(){
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
        int n,k;
        scanf("%d%d",&n,&k);
        int cnt=0,tot=0;
        while(k){
            if(k&1){
                tot+=poww(n,cnt); 
                tot%=MOD;
            }
            cnt++;
            k>>=1;
        }
        printf("%d\n",tot);
    }
    return 0;
}