读题
注意到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 ",tot); } return 0; }