题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1013
Konwledge Point:
快速幂:https://www.cnblogs.com/liubilan/p/9450568.html
除法取模:(a/b)%mod = (a%(b*mod))/b
当a/b比mod小,而a又比mod大的时候a先取余再除以b就会产生错误;为了避免这个错误,只需将模数乘以b即可;
这个题目其实就是找规律,n 有1e9大,不管是常规做法还是快速幂直接相加都会超时;
打表得知:S(n) = 3*S(n-1)+1; //S(n)表示3的0次到3的n次的和;
又因为S(n) = S(n-1) + 3的n次;
联立两个方程可以得到S(n) = (3的n+1次-1)/2;
附代码:
1 #include<iostream> 2 using namespace std; 3 4 #define LL long long 5 const LL MOD = 1000000007; 6 LL n; 7 8 LL pow(LL x) 9 { 10 LL ans=1, tmp=3; 11 while(x) { 12 if(x&1) { 13 ans *= tmp; 14 ans%=(MOD*2); 15 } 16 tmp *= tmp; 17 tmp %= (MOD*2); 18 x>>=1; 19 } 20 return ans; 21 } 22 23 int main() 24 { 25 while(cin>>n) 26 { 27 cout<<(pow(n+1)-1)/2<<endl; 28 } 29 30 return 0; 31 }