分治加强版

给定 $c,n,mod$ 求 $r^0+r^1+r^2+...+r^n$

数据范围: $n<10^{16}$

思路:每次把求和数列分成两半,前面一半,后面一半,前面的都乘上一个数,得到后面的,以此类推,算到第一个,就可以了。

复杂度:$O({log_n}^2)$

代码:

#include<bits/stdc++.h>
using namespace std;
long long c,n,mod,ans;
long long ksm(int x,int p)
{
    long long d=x,m=p,cnt=1;
    while(m)
    {
        if(m%2==1) cnt*=d,cnt%=mod;
        d*=d,m/=2,d%=mod;
    }
    return cnt;
}
long long sum(int r)
{
    if(r==0) return 1;
    int mid=r/2,res;
    res=sum(mid);
    if(r%2==1) return (res+res*ksm(c,mid+1)%mod)%mod;
    else return (res+res*ksm(c,mid+1)%mod+ksm(c,r))%mod;
}
int main()
{
    scanf("%d%d%d",&c,&n,&mod);
    ans=sum(n);
    printf("%lld",ans);
    return 0;
}
posted @ 2021-10-18 15:09  hubingshan  阅读(20)  评论(0)    收藏  举报  来源