まほう部落

解题思路
作为这套题中第二难的题目,这竟然是第一题…
这道题看起来很简单,然后我们看一眼数据:哇,竟然是
n
<
=
1000000000
n<=1000000000
n<=1000000000 !
然而这个数据只能做
O
(
log
2
n
)
O(\log_2n)
O(log2n) ,我们又仔细看了一眼题目:这很明显是等比数列求和。等比数列求和的公式我们都知道啦,就是:
S
n
=
a
1
(
1
−
q
n
)
1
−
q
或
S
n
=
a
1
−
a
n
q
1
−
q
S^n=\frac{a_1(1-q^n)}{1-q} 或S^n=\frac{a_1-a_nq}{1-q}
Sn=1−qa1(1−qn)或Sn=1−qa1−anq
其中的
q
n
q^n
qn 我们就可以用 快速幂 来求,这恰好是
log
2
n
\log_2n
log2n 的算法!
然而,下面的我就也不是很懂了:逆元
逆元好像就是在
a
b
\frac{a}{b}
ba %
c
c
c 的时爆精度的情况,所以我们要将除法转换成乘法…… (口胡不下去了)
code
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const ll mod=1000000007;
ll n;
ll ksm(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y&1)
ans=ans*x%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
int main()
{
cin>>n;
cout<<(ksm(3,n+1)-1)*(mod+1)/2%mod<<endl;
}
本文介绍了一种使用快速幂运算实现等比数列求和的高效算法,并通过一个具体的编程实例展示了如何在大规模数据集上应用此算法。特别地,文章详细解释了如何利用快速幂将复杂度降低到O(log2n)。

被折叠的 条评论
为什么被折叠?



