我试图计算0 < n ≤ 10⁹
的值
re=(2^n)%1000000007
我写了这段代码:
int main()
{
int n,i,re=1;
scanf("%d",&n);
for(i=0; n>i; i++) re=(2*re)%1000000007;
printf("%d",re);
}
当n
为10⁹时,我的代码需要太长时间。
我可以做些什么来加快速度?
答案 0 :(得分:1)
您可以遵循二进制取词,类似
#define MOD 1000000007
long long fastExp(int b, int e) {
long long r=1;
while(e>0) {
if(e&1) r=(r*b)%MOD;
b=(b*b)%MOD;
e/=2;
}
return r%MOD;
}
将其称为fastExp(2,n)
。
复杂性非常简单,因为它执行log2(n)
操作,因此这比O(n)
解决方案效果更好。
解释为什么你的解决方案得到了TLE。像SPOJ
等那样的在线评委通常需要1秒才能进行10^8
循环操作。当你输入n=10^9
时,你可以做更多的事情。
答案 1 :(得分:0)
您可以通过更快地计算功率计算,在min(mid)
的对数时间内完成此操作。
n
例如,2 5 表示计算x = 2 2 和x * x * 2.
答案 2 :(得分:0)
如果n
小于30
,则结果为1 << n
,否则您可以计算1 << 30
并让for
循环从{{1}开始}}。如果您检查31
并减去%
(因为if (re > 1000000007)
小于1000000007
,然后再乘以{{},您也可以摆脱昂贵的re
操作1}},它小于1000000007
,因此减去2
就足够了:
2*1000000007