diff --git a/fps/FPS_division.hpp b/fps/FPS_division.hpp new file mode 100644 index 0000000..025abaa --- /dev/null +++ b/fps/FPS_division.hpp @@ -0,0 +1,34 @@ +#pragma once +#include +#include + +#include "FPS_inv.hpp" +namespace po167{ +template +// f = g * res.first + res.second +// |res.first| <= |f| - |g| + 1 +// |res.second| <= |g| - 1 +std::pair, std::vector> +FPS_division(std::vector f, std::vector g){ + assert(!f.empty() && f.back() != 0); + assert(!g.empty() && g.back() != 0); + if (f.size() < g.size()){ + return {{}, f}; + } + // rev(f) / rev(g) = rev(q) (mod x ^ {|f| - |g| + 1}) + std::vector r = f; + std::reverse(f.begin(), f.end()); + std::reverse(g.begin(), g.end()); + int z = (int)f.size() - (int)g.size() + 1; + f.resize(z); + std::vector q = atcoder::convolution(f, FPS_inv(g, z)); + q.resize(z); + std::reverse(g.begin(), g.end()); + std::reverse(q.begin(), q.end()); + f = atcoder::convolution(q, g); + for (int i = 0; i < (int)f.size(); i++) r[i] -= f[i]; + while (!q.empty() && q.back() == 0) q.pop_back(); + while (!r.empty() && r.back() == 0) r.pop_back(); + return {q, r}; +} +} \ No newline at end of file diff --git a/test/fps/division.test.cpp b/test/fps/division.test.cpp new file mode 100644 index 0000000..917e440 --- /dev/null +++ b/test/fps/division.test.cpp @@ -0,0 +1,33 @@ +#define PROBLEM "https://judge.yosupo.jp/problem/division_of_polynomials" + +#include "../../fps/FPS_division.hpp" + +#include +#include +#include + +int main(){ + int N, M, a; + std::cin >> N >> M; + std::vector f(N), g(M); + for (int i = 0; i < N; i++){ + std::cin >> a; + f[i] = a; + } + for (int i = 0; i < M; i++){ + std::cin >> a; + g[i] = a; + } + auto ans = po167::FPS_division(f, g); + std::cout << ans.first.size() << " " << ans.second.size() << "\n"; + for (int i = 0; i < (int)ans.first.size(); i++){ + if (i) std::cout << " "; + std::cout << ans.first[i].val(); + } + std::cout << "\n"; + for (int i = 0; i < (int)ans.second.size(); i++){ + if (i) std::cout << " "; + std::cout << ans.second[i].val(); + } + std::cout << "\n"; +} \ No newline at end of file