如何有效地计算2的大功率?

时间:2017-12-14 15:55:50

标签: c performance integer-arithmetic exponentiation

我试图计算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⁹时,我的代码需要太长时间。

我可以做些什么来加快速度?

3 个答案:

答案 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

完整的计划:https://ideone.com/0FRcaf