考慮生成函式
每乙個物品的生成函式:
\(\begina(x)=\sum_x^=\frac\end\)
(後面為其封閉形式)
答案:\(\begin\zeta(x)=\prod_^n\sum_x^\end\)
時間複雜度 \(\theta(nm\log m)\),會 \(tle\)。
把每乙個物品的生成函式都卷起來時間複雜度吃不消——但是加起來是可以的。
考慮給\(a(x)\)取個\(\ln\),然後再\(exp\)回去。
設:\(f(x)=1-x^v,g(x)=\ln f(x)\)
開始推式子:
\(\begin
g(x)&=\ln f(x)\\
g'(x)&=\frac\\
g'(x)&=-\frac}\\
g'(x)&=-\sum_v\times x^\times x^\\
g'(x)&=-\sum_v\times x^\\
g(x)&=-\sum_\frac}\\
g(x)&=-\sum_\frac}\\
\ln a(x)&=\sum_\frac}
\end\)
有了這個式子,我們就可以很容易地將各物品的\(\ln\)的和求出來了,然後再將求出來的式子進行\(exp\)還原即可。
#includeusing namespace std;
const int n=4e5+5,mod=998244353;
int a[n],b[n],rev[n],inv[n],cnt[n],n,m,l,x;
int pow(int a,int b)
return res;
}void get(int n,int opt=1)
void fft(int *a,int opt)
} if (opt==-1) for (int i=0,v=pow(l,mod-2);i}void qiud(int *f,int *g,int n)
void jif(int *f,int *g,int n)
void inv(int *f,int *g,int n)
}void ln(int *f,int *g,int n)
void exp(int *f,int *g,int n)
}int main()
exp(b,a,m+1);
for (int i=1;i<=m;i++) b[i]=(b[i]+mod)%mod,printf("%d\n",b[i]);
return 0;
}
洛谷P4389 付公主的揹包
傳送門 有 n 類物品,每種物品體積為 v i 且都有無數多件。問你塞滿容量為 s 的揹包方案數,對於每個 s in 1,m m 給定且 leq 10 5 都求出方案數。答案對 998244353 取模。30 的資料,n,m leq 3000 60 的資料,純隨機生成 100 的資料,n,m leq...
洛谷P4389 付公主的揹包
題目大意 有 n n leqslant10 5 種物品,第 i 個物品體積為 v i 都有 10 5 件。給定 m m leqslant10 5 對於 s in 1,m 請你回答用這些商品恰好裝 s 體積的方案數 題解 by weng weijie 揹包問題模板 誤 對每個物品構造生成函式 f x ...
洛谷P4389 付公主的揹包 生成函式 多項式
題目鏈結戳這裡 有 n 件不同的商品,每件物品都有無限個,輸出總體積為 1,m 的方案數 直接跑揹包有 30 考慮把每個物品的生成函式設出來,對於一件體積為 v 的物品 f x 1 x v x cdots x cdots 那麼答案 f x 就是每個物品的 f 卷起來 f x prod limits ...