This documentation is automatically generated by online-judge-tools/verification-helper
#include "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();
}
#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();
}