内存限制:512 MiB
时间限制:1000 ms
你有 m m m 种物品,第 i i i 种物品的大小为 a i a_i ai,数量为 b i b_i bi( b i = 0 b_i=0 bi=0 表示有无限个)。
你还有 n n n 个背包,体积分别为 1 1 1 到 n n n,现在你很想知道用这些物品填满某个背包的方案数。
为了满足你的好奇心,你决定把填满每个背包的方案数都算一遍。
因为你其实只是闲得无聊,所以你只想知道方案数对 998244353 998244353 998244353( 7 × 17 × 2 23 + 1 7\times 17\times 2^{23}+1 7×17×223+1,一个质数)取模后的值。
0 < n , m ≤ 1 0 5 , 0 ≤ a i ≤ 110000 , 0 ≤ b i ≤ 1 0 6 0< n,m\le 10^5, 0\le a_i\le 110000,0\le b_i\le 10^6 0<n,m≤105,0≤ai≤110000,0≤bi≤106。
把第 i i i 个物品的生成函数写出,设 b i > 0 b_i>0 bi>0,即 F i ( x ) = ∑ j = 0 b i x a i × j = 1 − x a i × ( b i + 1 ) 1 − x a i F_i(x)=\sum_{j=0}^{b_i} x^{a_i \times j}=\frac{1-x^{a_i \times (b_i+1)}}{1-x^{a_i}} Fi(x)=∑j=0bixai×j=1−xai1−xai×(bi+1)
那么当 b i = 0 b_i=0 bi=0 时, F i ( x ) = ∑ j = 0 ∞ x a i × j = 1 1 − x a i F_i(x)=\sum_{j=0}^{\infty} x^{a_i \times j}=\frac{1}{1-x^{a_i}} Fi(x)=∑j=0∞xai×j=1−xai1
则最后的答案的生成函数 G ( x ) = ∏ i = 1 n F i ( x ) G(x)=\prod_{i=1}^nF_i(x) G(x)=∏i=1nFi(x)
两边取对数,即 ln G ( x ) = ln ( ∏ i = 1 n F i ( x ) ) = ∑ i = 1 n ln F i ( x ) = ∑ i = 1 n ( ln ( 1 − x a i × ( b i + 1 ) ) − ln ( 1 − x a i ) ) \ln G(x)=\ln (\prod_{i=1}^nF_i(x))=\sum_{i=1}^n \ln F_i(x)=\sum_{i=1}^n(\ln (1-x^{a_i \times (b_i+1)})-\ln(1-x^{a_i})) lnG(x)=ln(∏i=1nFi(x))=∑i=1nlnFi(x)=∑i=1n(ln(1−xai×(bi+1))−ln(1−xai))
又知道 ln ( 1 − x k ) = ∑ i = 1 ∞ x i × k i \ln(1-x^k)=\sum_{i=1}^{\infty} \frac{x^{i \times k}}{i} ln(1−xk)=∑i=1∞ixi×k
所以对于每个 k k k ,都会对 x i × k x^{i \times k} xi×k 的系数造成影响,所以这一部分可以 O ( n ln n ) O(n\ln n) O(nlnn) 预处理
所以最后做个多项式 e x p exp exp 即可
#include
#define I inline
using namespace std;
const int P=998244353,N=5e5+5;
int n,m,a[N],b[N],r[N],t,p,G[2]={3,332748118};
int A[N],B[N],C[N],D[N],E[N],F[N],jc[N],ny[N];
I int X(int x){if (x>=P) x-=P;return x;}
I int inv(int x){return 1ll*jc[x-1]*ny[x]%P;}
I int K(int x,int y){
int A=1;
for (;y;y>>=1,x=1ll*x*x%P)
if (y&1) A=1ll*A*x%P;
return A;
}
I void Ntt(int *g,bool o){
for (int i=0;i>1]>>1)|((i&1)<<(p-1));
}
I void getinv(int *a,int *b,int l){
if (l==1){
b[0]=K(a[0],P-2);return;
}
getinv(a,b,(l+1)>>1);
for (int i=0;i>1);
for (int i=0;i