输入格式:
第一行输入两个整数a(1≤a≤109)与n(0≤n≤1018).
输出格式:
输入样例1:
3 2
输出样例1:
13
样例解释:30+31+32=13
输入样例2:
1000000 1000000000000000000
输出样例2:
143480269
思路
又学到了,用分治+快速幂求等比数列和
实现分治法求等比数列和_Lacon的BOKO-CSDN博客
代码
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll mod=1e9+7;
ll fun(ll a,ll n){
ll sum=1;
while(n){
if(n&1) sum=sum*a%mod;
a=a*a%mod;
n>>=1;
}
return sum;
}
int getsum(ll a,ll n){
if(n==0) return 1;
else if(n&1){//奇数
ll sum=1+fun(a,(n+1)/2)%mod;
return (sum*getsum(a,(n-1)/2))%mod;
}
else{
ll sum=(1+fun(a,n/2))%mod;
return ((sum*getsum(a,n/2-1))%mod+fun(a,n))%mod;
}
}
int main(){
ll a,n;
cin>>a>>n;
cout<<getsum(a,n);
return 0;
}