题解:P10982 Connected Graph
图计数入门题。
记
考虑使用容斥,先
但是我们钦定的这个联通的点集,会在一个拥有多个联通块的图中被计算多次(每个联通块可以作为被钦定联通的集合),发现这张图中
我们直接枚举被钦定联通的集合大小,然后组合数是分配系数,由于
时间复杂度
#include<bits/stdc++.h>
#define pb emplace_back
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
const int maxn=1e3+10;
const int mod=1004535809;
void add(int &x,int y){ x=x+y>=mod?x+y-mod:x+y; }
void sub(int &x,int y){ x=x<y?x-y+mod:x-y; }
void cmax(int &x,int y){ x=x>y?x:y; }
void cmin(int &x,int y){ x=x<y?x:y; }
int f[maxn],pw[maxn*maxn],C[maxn][maxn],n;
int main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>n; C[0][0]=1; pw[0]=1;
for(int i=1;i<=n*n;i++) pw[i]=2ll*pw[i-1]%mod;
for(int i=1;i<=n;i++){
C[i][0]=1;
for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
f[1]=1;
for(int i=2;i<=n;i++){
f[i]=pw[C[i][2]];
for(int j=1;j<i;j++)
sub(f[i],1ll*f[j]*C[i-1][j-1]%mod*pw[C[i-j][2]]%mod);
}
cout<<f[n];
return 0;
}