分治加强版
给定 $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;
}

浙公网安备 33010602011771号