求$a^0 + a^1 + a^2 + ... + a^{x-1}$,值很大,模m?

有同学会想到先求出$a^x - 1$,再除以a-1,但由于可能不存在逆元,出现各种问题,建议还是分治求。

#include <stdio.h>
#define LL long long
LL n, m, i, j, k, a, x;
LL mi(LL a, LL b){
    LL s = 1;
    while(b){
        if(b&1) s = s * a % m;
        a = a * a % m, b /= 2;
    }
    return s;
}
LL dfs(LL x){
    if(x == 0) return 1;
    if(x&1){
        LL t = dfs(x/2);
        return (t + t*mi(a, x+1>>1)) % m;
    }//偶数个,前一半和为t,后一半是前一半的倍数
    else{
        return (dfs(x-1)+mi(a, x)) % m;
    }//奇数个转偶数,x次幂单独求
}//返回0次幂、1次幂、……、x次幂之和
int main(){
    scanf("%lld%lld%lld", &a, &x, &m);
    printf("%lld\n", dfs(--x)%m);
    return 0;
}

作者 crxis

发表回复