library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub kk2a/library

:heavy_check_mark: fps/poly_to_newton_basis.hpp

Verified with

Code

#ifndef KK2_FPS_POLY_TO_NEWTON_BASIS_HPP
#define KK2_FPS_POLY_TO_NEWTON_BASIS_HPP 1

#include <cassert>
#include <vector>

namespace kk2 {

// return b s.t.
// f(X) = \sum_{i = 0} ^ {n - 1} b_i \prod_{j = 0} ^ {i - 1} (X - p_j)
template <class FPS, class mint = typename FPS::value_type>
std::vector<mint> convert_to_newton_basis(const FPS &f, const std::vector<mint> &p) {
    int n = (int)f.size();
    assert(n == (int)p.size());

    int m = 1;
    while (m < n) m <<= 1;

    std::vector<FPS> buf(m << 1);
    for (int i = 0; i < n; i++) { buf[m + i] = {-p[i], 1}; }
    for (int i = m - 1; i > 0; i--) {
        if (((i + 1) & -(i + 1)) == i + 1) continue;
        if (buf[i << 1 | 1].empty()) {
            buf[i] = buf[i << 1 | 0];
        } else {
            buf[i] = buf[i << 1 | 0] * buf[i << 1 | 1];
        }
    }
    buf[1] = f;
    for (int i = 1; i < m; i++) {
        if (buf[i].empty()) continue;
        buf[i << 1 | 1] = buf[i] / buf[i << 1 | 0];
        buf[i << 1 | 0] = buf[i] % buf[i << 1 | 0];
    }
    std::vector<mint> b(n);
    for (int i = 0; i < n; i++) { b[i] = buf[m + i].eval(0); }
    return b;
}

} // namespace kk2

#endif // KK2_FPS_POLY_TO_NEWTON_BASIS_HPP
#line 1 "fps/poly_to_newton_basis.hpp"



#include <cassert>
#include <vector>

namespace kk2 {

// return b s.t.
// f(X) = \sum_{i = 0} ^ {n - 1} b_i \prod_{j = 0} ^ {i - 1} (X - p_j)
template <class FPS, class mint = typename FPS::value_type>
std::vector<mint> convert_to_newton_basis(const FPS &f, const std::vector<mint> &p) {
    int n = (int)f.size();
    assert(n == (int)p.size());

    int m = 1;
    while (m < n) m <<= 1;

    std::vector<FPS> buf(m << 1);
    for (int i = 0; i < n; i++) { buf[m + i] = {-p[i], 1}; }
    for (int i = m - 1; i > 0; i--) {
        if (((i + 1) & -(i + 1)) == i + 1) continue;
        if (buf[i << 1 | 1].empty()) {
            buf[i] = buf[i << 1 | 0];
        } else {
            buf[i] = buf[i << 1 | 0] * buf[i << 1 | 1];
        }
    }
    buf[1] = f;
    for (int i = 1; i < m; i++) {
        if (buf[i].empty()) continue;
        buf[i << 1 | 1] = buf[i] / buf[i << 1 | 0];
        buf[i << 1 | 0] = buf[i] % buf[i << 1 | 0];
    }
    std::vector<mint> b(n);
    for (int i = 0; i < n; i++) { b[i] = buf[m + i].eval(0); }
    return b;
}

} // namespace kk2
Back to top page