UOJ 348 WC2018 州區劃分

2022-03-31 14:43:56 字數 2214 閱讀 6101

第一次知道子集卷積可以自己卷自己。

這是一道子集卷積模板題。

設 $sum[s]$ 表示點集 s 的點權和。

設 $f[s]$ 表示對點集 s 進行州區劃分得到的答案,定義 $g[s]$ 在點集 s 合法時為 $(sum[s])^p$,不合法時為 0 。

則$$f[s] = \frac\sum_ f[t]g[s-t]$$

這東西是個子集卷積的形式。

但是在卷的時候要呼叫自己。

那怎麼辦?

一邊做子集卷積,一邊得出新答案。

具體地:列舉一下集合大小 s ,每次通過之前的結果做卷積求出當前集合大小的所有集合的答案。

直接保留 fmt 後的結果,方便計算、降低時間複雜度。

具體細節見**。

時間複雜度 $o(n^22^n)$ 。

#pragma gcc optimize("ofast","inline")

#include #define clr(x) memset(x,0,sizeof (x))

#define for(i,a,b) for (int i=a;i<=b;i++)

#define fod(i,b,a) for (int i=b;i>=a;i--)

#define pb(x) push_back(x)

#define mp(x,y) make_pair(x,y)

#define fi first

#define se second

#define _seed_ ('c'+'l'+'y'+'a'+'k'+'i'+'o'+'i')

#define outval(x) printf(#x" = %d\n",x)

#define outvec(x) printf("vec "#x" = ");for (auto _v : x)printf("%d ",_v);puts("")

#define outtag(x) puts("----------"#x"----------")

#define outarr(a,l,r) printf(#a"[%d...%d] = ",l,r);\

for(_v2,l,r)printf("%d ",a[_v2]);puts("");

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef vector vi;

ll read()

const int n=23,s=1<<21,mod=998244353;

const ull bmod=16ull*mod*mod;

int pow(int x,int y)

void add(int &x,int y)

void del(int &x,int y)

int n,m,s,p;

vector e[n];

int w[n];

int cnt1[s],sum[s],f[s];

int g[n][n];

int u[n][s],v[n][s];

int check(int s)

head=tail=0;

q[++tail]=fir,vis[fir]=1;

while (head>y&1)

} if (tail!=cnt1[s])

return 1;

for(i,0,n-1)

if (in[i])

return 1;

return 0;

}void fmt(int *a)

f[i]=check(i);

sum[i]=pow(sum[i],p);

if (f[i])

u[cnt1[i]][i]=sum[i];

} for(i,0,n)

fmt(u[i]);

v[0][0]=1;

fmt(v[0]);

for(i,1,n)

v[i][k]=tmp%mod;

} ifmt(v[i]);

for(k,0,s-1)

if (cnt1[k]==i)

v[i][k]=(ll)v[i][k]*pow(sum[k],mod-2)%mod;

else

v[i][k]=0;

fmt(v[i]);

} ifmt(v[n]);

cout

}

WC2018 州區劃分

點此看題 設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 1 i s d p i g s i 其中f s f s f s 是w...

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 為這個狀態對應的城市的人口之和...