第一次知道子集卷積可以自己卷自己。
這是一道子集卷積模板題。
設 $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 為這個狀態對應的城市的人口之和...