:warning: 等比数列の総和 (mod) (Math/mod_sum_of_geometric_sequence.hpp)

sum_of_geometric_sequence

mint sum_of_geometric_sequence(mint a, mint r, long long n)

初項$a$、公比$r$、項数$n$からなる等比数列の部分和 $\sum_{i=0}^{n-1} a \cdot r^i$ を計算し、その値を返します。

制約

  • $0 < n$

計算量

  • $O(\log n)$

Verified with

Code

#include <bits/stdc++.h>
using namespace std;

template <class mint>
mint sum_of_geometric_sequence(mint a, mint r, long long n)
{
    assert(0 < n);

    if (n == 1)
    {
        return a;
    }

    mint x = sum_of_geometric_sequence(a, r, n / 2);

    mint ret = x + r.pow(n / 2) * x;
    if (n & 1)
    {
        ret = (a + r * ret);
    }

    return ret;
};
#line 1 "Math/mod_sum_of_geometric_sequence.hpp"
#include <bits/stdc++.h>
using namespace std;

template <class mint>
mint sum_of_geometric_sequence(mint a, mint r, long long n)
{
    assert(0 < n);

    if (n == 1)
    {
        return a;
    }

    mint x = sum_of_geometric_sequence(a, r, n / 2);

    mint ret = x + r.pow(n / 2) * x;
    if (n & 1)
    {
        ret = (a + r * ret);
    }

    return ret;
};
Back to top page