Codeforces Round #747 (Div. 2) B. Special Numbers
阿新 • • 發佈:2021-10-20
讀題
注意到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; }