等比数列求和

__int64 sum(__int64 p,__int64 n)  //递归二分求 (1 + p + p^2 + p^3 +...+ p^n)%mod
{                          //奇数二分式 (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))
    if(n==0)               //偶数二分式 (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2)
        return 1;
    if(n%2)  //n为奇数,
        return (sum(p,n/2)*(1+POW(p,n/2+1)))%mod;
    else     //n为偶数
        return (sum(p,n/2-1)*(1+POW(p,n/2+1))+POW(p,n/2))%mod;
}

ll POW(ll a,ll n)
{
    ll base=a,ret=1;
    while(n)
    {
        if(n&1) ret=(ret%mod*base)%mod;
        base=(base*base)%mod;
        n>>=1;
    }
    return ret%mod;
}

 

posted @ 2017-11-19 18:42  会飞的雅蠛蝶  阅读(232)  评论(0编辑  收藏  举报