BZOJ4671 斯特林反演

2022-05-20 19:51:08 字數 1208 閱讀 3422

【bzoj4671】異或圖

很有意思的題

直接處理顯然很難,我們考慮範圍擴大以求容斥或反演這類的幫助

\(f_i\)表示至少有\(i\)個聯通塊的方案,形如設立\(i\)個聯通塊輪廓,聯通塊內連邊隨意,聯通塊與聯通塊之間無連邊

\(g_i\)表示恰好有\(i\)個聯通塊的方案,形如設立\(i\)個聯通塊輪廓,在保證內部聯通的情況下,外部塊與塊間無連邊

顯然:$$f_x=\sum\limits_^n\begini\x\endg_i$$

根據斯特林反演:$$g_x=\sum\limits_^n (-1)^\begini\x\endf_i$$

故\(g_1=\sum\limits_^n (-1)^\begini\\1\endf_i\)

而\(\begini\\1\end\)是階乘形式:\(\begini\\1\end=(i-1)!\)

化簡答案為:\(g_1=\sum\limits_^n (-1)^(i-1)!f_i\)

考慮\(f_i\)如何求出:狀壓點所屬聯通塊狀態,則我們要選擇圖集使塊與塊之間無邊,考慮列舉每個圖的\(s\)表示點與點之間的連邊(不屬同一聯通塊),我們壓到線性基里去,\(ele\)表示線性基元素,這些元素是不能選擇的(相異),故答案為\(2^\)

#includetypedef int ll;

const ll maxn=109;

ll n,n;

ll g[maxn][maxn][maxn],a[maxn];

char s[maxn];

long long ans,p[maxn],s,fac[15];

void dfs(ll x,ll up)

for(ll j=0;js^=p[j];}}

} ans+=1ll*((up&1)?1:-1)*fac[up-1]*(1ll

} for(ll i=1;i<=up+1;++i)

}int main()

ll now(0);

for(ll j=1;j<=n;++j) for(ll k=j+1;k<=n;++k) g[i][j][k]=s[++now]-'0';

} fac[0]=fac[1]=1; for(ll i=2;i<=n;++i) fac[i]=fac[i-1]*i;

dfs(1,0);

printf("%lld",ans);

return 0;

}

斯特林數 斯特林反演

第一類stirling數 s n,m 也可記為 beginn m end 第一類stirling分為無符號第一類stirling數 s u n,m 和帶符號第一類stirling數 s s n,m 他們分別表現為其公升階函式和降階函式的各項係數,形式如下 x x cdot x 1 cdot x 2 ...

Square(斯特林反演)

給出乙個 n m 大小的矩形,每個位置可以填上 1,c 中的任意乙個數,要求填好後任意兩行互不等價且任意兩列互不等價,兩行或兩列等價當且僅當對應位置完全相同,求方案數 n,m le 5000 這題是 wearry 出的神題,根本不會做。把題解搬過來了。首先我們有乙個很簡單的方式使得列之間互不等價,對...

二項式反演 斯特林數 斯特林反演 學習筆記

從錯排數講起,考慮乙個有n個元素的排列,若乙個排列中所有的元素都不在自己原來的位置上,那麼這樣的排列就稱為原排列的乙個錯排。用容斥來解決這個問題,不難發現錯排數即為g n i 1n 1 i ni n i 考慮二項式定理,1 1 n i 0n 1 i ni 0 上式當n 0時值為1,所以有 i 0n ...