點此看題
設d p[
s]
dp[s]
dp[s
]為選出來的點狀壓為s
ss,所得到的滿意度總和,轉移:
d p[
s]=1
f[s]
∑i∈s
dp[i
]×g[
s−i]
dp[s]=\frac\sum_dp[i]\times g[s-i]
dp[s]=
f[s]
1i∈
s∑d
p[i]
×g[s
−i]其中f[s
]f[s]
f[s]
是w
ww總和的p
pp次方,g[s
]g[s]
g[s]
是w
ww總和的p
pp次方 乘上 這個狀態是否合法。
顯然這個柿子可以用快速子集卷積,然鵝我t
tt了,不說了,盡量不要看我大常數的** 。
upd 2020-6-12:補充一點卡常的知識,如果這樣寫的話,就掛了:
for
(int i=
1;i<=n;i++
)
如果這樣寫的話,就快很多
for
(int i=
1;i<=n;i++
)
發現了嗎,其實是j
jj要在內層列舉,這樣呼叫空間會快很多,現在我過了,開心。
#include
const
int n =
405;
const
int m =
1<<21;
const
int mod =
998244353
;int
read()
int n,m,p,lim,a[n]
,b[n]
,w[n]
,f[m]
,inv[m]
;int deg[n]
,fa[n]
,bit[m]
,g[22
][m]
,dp[22]
[m];
intchk
(int s,
int i)
intqkpow
(int a,
int b)
return r;
}int
find
(int x)
void
fwt(
int*a,
int n,
int op)
}signed
main()
}for
(int j=
1;j<=m;j++)if
(chk
(i,a[j])&&
chk(i,b[j]))
for(
int j=
1;j<=n;j++
) z+
=(deg[j]&1
);if(z || y!=
1) g[x]
[i]=f[i]
; g[x]
[i]=
qkpow
(g[x]
[i],p)
; f[i]
=qkpow
(inv[f[i]
],p)
; bit[i]
=x;}
for(
int i=
0;i<=n;i++
)fwt
(g[i]
,lim,1)
; dp[0]
[0]=
1;fwt(dp[0]
,lim,1)
;int ans=0;
for(
int i=
1;i<=n;i++
)fwt
(dp[i]
,lim,-1
);for(
int j=
0;j) dp[i]
[j]=bit[j]
==i?
1ll*dp[i]
[j]*f[j]
%mod:0;
if(i!=n)
fwt(dp[i]
,lim,1)
;}printf
("%d\n"
,dp[n]
[lim-1]
);}
WC 2018 州區劃分
給乙個無向圖 g v,e 滿足 v 21 對於某一種將 g v,e 劃分為k個的有序集合方案,若每乙個子集 g i v i,e i e i 都不存在尤拉迴路,則會對答案貢獻為 其中,x 為集合元素,w x 為元素 x 的權值。題解 被題意坑成cu 我還是太菜了 其實很顯然我們會得到乙個 dp 設 f...
WC2018 州區劃分
題目 就當那個判斷乙個州不合法的條件是存在尤拉迴路吧 一張無向圖存在尤拉迴路的條件是 圖連通不存在度數為奇數的點 於是我們列舉每乙個子集,可以在 o 2 nn 2 的時間內判斷乙個集合是否能獨立成為乙個州 之後我們設 dp i 表示選取狀態為 i 的時候的答案,s i 為這個狀態對應的城市的人口之和...
WC2018 州區劃分
題面給一張帶點權的無向圖 要求對其劃分為聯通且不存在尤拉迴路的多個子圖 定義乙個子圖的貢獻是 第 i 個子圖的點權和佔前 i 個子圖的點權和的比例的 p 次冪 定義乙個劃分的貢獻是 該劃分下所有子圖的貢獻的乘積 求所有劃分的貢獻之和 設 f s 為選取點集為 s 時所有劃分的貢獻和 有 f s fr...