Luzhiled's Library

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

View the Project on GitHub ei1333/library

:heavy_check_mark: Count Subset Sum (math/fps/count-subset-sum.hpp)

Verified with

Code

/**
 * @brief Count Subset Sum
 */
template <template <typename> class FPS, typename Mint>
FPS<Mint> count_subset_sum(vector<Mint> &c) {
  const int n = (int)c.size();
  vector<Mint> inv(n);
  inv[0] = Mint(0);
  inv[1] = Mint(1);
  auto mod = Mint::mod();
  for (int i = 2; i < n; i++) {
    inv[i] = -inv[mod % i] * (mod / i);
  }
  FPS<Mint> f(n);
  for (int i = 1; i < n; i++) {
    for (int j = 1, d = i; d < n; j++, d += i) {
      if (j & 1)
        f[d] += c[i] * inv[j];
      else
        f[d] -= c[i] * inv[j];
    }
  }
  return f.exp();
}
#line 1 "math/fps/count-subset-sum.hpp"
/**
 * @brief Count Subset Sum
 */
template <template <typename> class FPS, typename Mint>
FPS<Mint> count_subset_sum(vector<Mint> &c) {
  const int n = (int)c.size();
  vector<Mint> inv(n);
  inv[0] = Mint(0);
  inv[1] = Mint(1);
  auto mod = Mint::mod();
  for (int i = 2; i < n; i++) {
    inv[i] = -inv[mod % i] * (mod / i);
  }
  FPS<Mint> f(n);
  for (int i = 1; i < n; i++) {
    for (int j = 1, d = i; d < n; j++, d += i) {
      if (j & 1)
        f[d] += c[i] * inv[j];
      else
        f[d] -= c[i] * inv[j];
    }
  }
  return f.exp();
}
Back to top page