样例输入
3
4
5
样例输出
33
289
3414
快速幂:用来快速的求 a的k 次方,时间复杂度O(log n)
实际上就是将 a^k 中的k幂分解成许多2^i的和,而这种分解方法就按照k的二进制数来分解就可以了。下标索引为j的位如果为1就代表a^j是k分解中的一部分,为0则不是。
注意中间数据都要设成 long long 以防止数据溢出
#include<iostream>
using namespace std;
long long p = 100000007;
long long f(long long a,long long k){
long long res = 1;
while(k){
if (k & 1) res = res * a % p; // 如果二进制数中该位是1,则指数加上2^(位索引下标)
k >>= 1;
a = a*a % p;
}
return res;
}
int main(){
int n;
while(scanf("%d",&n) != EOF){
long long sum = 0;
for (int i = 1; i <= n; ++i){
sum += (f(i,i)%p);
}
cout<<(sum + 1)%p<<endl;
}
return 0;
}