1. 程式人生 > 其它 >Codeforces Round #747 (Div. 2) B. Special Numbers

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

讀題

注意到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; }