This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub ebi-fly13/Library
#include "fps/product_of_fps.hpp"
$\prod_{i = 0}^n f_i$ を $O(N(\log N)^2)$ で計算する。
#pragma once #include <deque> #include <vector> #include "../modint/base.hpp" namespace ebi { template <Modint mint, std::vector<mint> (*convolution)(const std::vector<mint> &, const std::vector<mint> &)> std::vector<mint> product_of_fps(const std::vector<std::vector<mint>> &fs) { if (fs.empty()) return {1}; std::deque<std::vector<mint>> deque; for (auto &f : fs) deque.push_back(f); while (deque.size() > 1) { auto f = deque.front(); deque.pop_front(); auto g = deque.front(); deque.pop_front(); deque.push_back(convolution(f, g)); } return deque.front(); } } // namespace ebi
#line 2 "fps/product_of_fps.hpp" #include <deque> #include <vector> #line 2 "modint/base.hpp" #include <concepts> #include <iostream> #include <utility> namespace ebi { template <class T> concept Modint = requires(T a, T b) { a + b; a - b; a * b; a / b; a.inv(); a.val(); a.pow(std::declval<long long>()); T::mod(); }; template <Modint mint> std::istream &operator>>(std::istream &os, mint &a) { long long x; os >> x; a = x; return os; } template <Modint mint> std::ostream &operator<<(std::ostream &os, const mint &a) { return os << a.val(); } } // namespace ebi #line 7 "fps/product_of_fps.hpp" namespace ebi { template <Modint mint, std::vector<mint> (*convolution)(const std::vector<mint> &, const std::vector<mint> &)> std::vector<mint> product_of_fps(const std::vector<std::vector<mint>> &fs) { if (fs.empty()) return {1}; std::deque<std::vector<mint>> deque; for (auto &f : fs) deque.push_back(f); while (deque.size() > 1) { auto f = deque.front(); deque.pop_front(); auto g = deque.front(); deque.pop_front(); deque.push_back(convolution(f, g)); } return deque.front(); } } // namespace ebi