[ABC293E] Geometric Progression 题解

[ABC293E] Geometric Progression 题解

神中神数论

题目描述

给定整数 \(A, X, M\),求

\[\sum_{i= 0} ^ {X - 1}A^i\bmod M \]

  • \(1 \le A, M \le 10^9\)

  • \(1\le X\le 10^{12}\)

Solution1

最酷炫的一个,分治

可以发现

\[\sum_{i= 0} ^ {X - 1}A^i=\begin{cases} \sum_{i= 0} ^ {X - 2}A^i + A^{X-1} & ,X-1\bmod 2 \equiv 1 \\ \sum_{i = 0} ^ {\frac{X-1}2 }\times(A^{\frac{X-1}2} + 1) & ,X-1\bmod 2 \equiv 0 \end{cases} \]

显然时间复杂度为 \(O(\log X)\)

int solve(int a, int k)
{
    if(k == 1) return 1;
    if(k % 2) return (solve(a, k - 1) + qmi(a, k - 1)) % mod;
    return (solve(a, k / 2) * (qmi(a, k / 2) + 1)) % mod;
}

来自Jasper08大佬

Solution2

最好理解的方法,矩阵乘法

若令 \(f_i = \sum\limits_{i=0}^{X-1}A^i\),则有 \(f_i = Af_{i - 1} + 1\)

显然可以用矩阵加速这个递推过程:

\[\begin{bmatrix} A & 1\\ 0 & 1 \end{bmatrix} \times \begin{bmatrix} f_{i-1}\\ 1 \end{bmatrix} = \begin{bmatrix} f_i\\ 1 \end{bmatrix} \]

所以初始状态 \(f_1 = 1\)

则有

\[\begin{bmatrix} A & 1\\ 0 & 1 \end{bmatrix}^{X-1} \times \begin{bmatrix} f_{1}\\ 1 \end{bmatrix} = \begin{bmatrix} f_X\\ 1 \end{bmatrix} \]

时间复杂度:\(O(\log X)\)

Solution3

最快的方法 / 最神仙的方法,同余方程

若令 \(S = \sum_{i=0}^{X-1}A^i\),则有 \(AS = \sum_{i=1}^XA_i\)

因此错位相减得到,\((A-1)S \equiv A^X-1\pmod {M(A-1)}\),把 \(A-1\) 移过去求逆元不可行,因为 \(A-1\)\(M\) 不一定互质,不一定存在逆元。

可以证明 \((A-1)|(A^X-1\bmod M(A-1))\)

时间复杂度:\(O(\log M)\)

signed main()
{
    if(A == 1)
    {
        write(X % mod);
        return 0;
    }
    mod = mod * (A - 1);
    int a = A, b = qmi(A, X);
    b = (b + mod) % mod;
    if(A - 1 == 0) 
    {
        cout << 0 << endl;
        return 0;
    }
    write(b / (A - 1));
 
    return 0;
}

来自 CTR_WU 大佬

posted @ 2023-03-11 22:49  MoyouSayuki  阅读(51)  评论(0编辑  收藏  举报
:name :name