C++ 大数和的模

C++ 大数和的模,c++,math,C++,Math,我需要计算下一个数的模10^9+7: 2^(n-1)+2(n-2)+…+2(n-p) 其中值为: 不。提示:(x+y)mod z==((x mod z)+(y mod z)mod z)。我就是这么做的,不是吗@EJPNo,这不是你做的。您将所有的数字相加,这将溢出,然后取模数。方程式显示了如何避免溢出。每次加法后都必须取模。power可能只返回long(从10^9

我需要计算下一个数的模10^9+7: 2^(n-1)+2(n-2)+…+2(n-p) 其中值为:
不。提示:
(x+y)mod z==((x mod z)+(y mod z)mod z)
。我就是这么做的,不是吗@EJPNo,这不是你做的。您将所有的数字相加,这将溢出,然后取模数。方程式显示了如何避免溢出。每次加法后都必须取模。
power
可能只返回
long
(从10^9<2^31开始)。虽然sol需要额外的精度。我更改了代码,现在可以了吗@埃吉普诺。提示:
(x+y)mod z==((x mod z)+(y mod z)mod z)
。我就是这么做的,不是吗@EJPNo,这不是你做的。您将所有的数字相加,这将溢出,然后取模数。方程式显示了如何避免溢出。每次加法后都必须取模。
power
可能只返回
long
(从10^9<2^31开始)。虽然sol需要额外的精度。我更改了代码,现在可以了吗@EJP
long long power(int x,int n)//calculates (x^n) % 10^9+7
{
    long long sol=1;
    long long b=x;
    while(n){
        if(n&1==1){
            sol*=b;
            sol%=1000000007;
        }
        n>>=1;
        b*=b;
        b%=1000000007;
    }
    return sol;
}

 long long calculate(int n,int p){//calculates 2^(n-1)+2^(n-2)+...+2^(n-p)
    long long ret=power(2,n-1);p-=1;
    while(p--!=0)
        ret=(ret%1000000007+(ret/2)%1000000007)%1000000007;
    return ret;
}