題目鏈結
這題乍一眼應該是個生成函式題
我們可以把體積轉化成生成函式f(x
)=[x
f(x)=[x
f(x)=[
x%v==0
]v==0]
v==0
]然後跑1e5次fft就可以了
emmm,感覺有點不妙啊,1e5次fft什麼的好像肯定要t啊
我們感受下複雜度主要集中在卷積上面
因為求ln能化乘為加,所以可以對生成函式求一波ln康康
好的,發現很有規律f(x
)=[x
f(x)=[x
f(x)=[
x%v==0
]∗1x
v==0]*\frac
v==0]∗
x1那麼調和級數加一下,求exp就可以啦,至於相同項,肯定是出現幾次加幾倍嘍
**如下:
#include
#define mod 998244353
#define gg 3
using
namespace std;
int r[
400040
],n,v,cnt[
200020];
long
long inv[
400040
],tmp1[
400040
],tmp2[
400040
],t***[
400040
],ln[
400040
],f[
400040
],de[
400040
],in[
400040
],ex[
400040];
long
long
kasumi
(long
long a,
long
long b)
return ans;
}void
ntt(
long
long
*a,int kd,
int cnt)
for(
int mid=
1;mid}}
if(kd)}}
void
rev(
int cnt)
}void
der(
const
long
long
*a,int cnt)
}void
inte
(const
long
long
*a,int cnt)
}void
get_inv
(const
long
long
*a,int len)
ntt(tmp1,
0,cnt)
;ntt
(tmp2,
0,cnt)
;for
(int i=
0;i)ntt
(tmp1,
1,cnt)
;for
(int i=
0;i>
1;i++)}
}void
get_ln
(const
long
long
*a,int len)
void
get_exp
(const
long
long
*a,int len)
for(
int i=lim>>
1;i) tmp1[i]
=tmp2[i]
=t***[i]=0
;ntt
(t***,
0,cnt)
;ntt
(tmp1,
0,cnt)
;ntt
(tmp2,
0,cnt)
;for
(int i=
0;i)ntt
(t***,
1,cnt)
;for
(int i=
0;i>
1;i++)}
}int
main()
for(
int i=
1;i<=v;i++)}
}// for(int i=1;i<=10;i++) printf("%lld ",f[i]);
// puts("");
get_exp
(f,(v+1)
*2);
for(
int i=
1;i<=v;i++
)printf
("%lld\n"
,ex[i]);
}
洛谷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 付公主的揹包 解題報告
付公主有乙個可愛的揹包qwq 這個揹包最多可以裝 10 5 大小的東西 付公主有 n 種商品,她要準備出攤了 每種商品體積為 v i 都有 10 5 件 給定 m 對於 s in 1,m 請你回答用這些商品恰好裝 s 體積的方案數 第一行 n,m 第二行 v 1 sim v n m 行,第 i 行代...