AC代码
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn = 1e6+50; const int inf = 0x3f3f3f3f,mod = 1000000007; const double epx = 1e-10; typedef long long ll; ll poww(ll n,ll m) { ll ans = 1; while(m > 0) { if(m & 1)ans = (ans * n) % mod; m = m >> 1; n = (n * n) % mod; } return ans; } ll sum(ll a,ll n) { if(n==1) return a; ll t=sum(a,n/2); if(n&1) { ll cur=poww(a,n/2+1)%mod; t=(t+(t*cur)%mod)%mod; t=(t+cur)%mod; } else { ll cur=poww(a,n/2)%mod; t=(t+(t*cur)%mod)%mod; } return t; } int main() { ll a,n; cin>>a>>n; cout<<sum(a,n)<<endl; }
参考博客 https://blog.csdn.net/acdreamers/article/details/7851144