求出有n個點的有標號簡單連通無向圖的數目。什麼破玩意,直接輸出\(2^\)走人
我們發現這張圖要求連通,而上式肯定不能保證連通。
其實上式表示的是不保證連通的有標號簡單無向圖。
就差在乙個連通上啊。
所以我們設\(f(x)\)表示有x個點的有標號簡單連通無向圖的數目。
然後設\(g(x)\)為上式,即不保證連通時的方案數
於是我們列舉節點1所在的連通塊的大小,有
\[g(n) = \sum_^nc_^f(i)g(n-1)\]即
\[\frac = \frac^nc_^f(i)g(n-1)}
\]\[\frac} = \sum_\frac\frac^2}}
\]那麼我們分別設它們的生成函式為
\[a(x) = \sum_^\fracx^n
\]\[b(x) = \sum_^\frac}x^n
\]\[c(x) = \sum_^\frac}x^n
\]所以我們有
\[c(x) = a(x)b(x)
\]那麼有
\[a(x) \equiv b^(x)c(x) (mod\textx^)
\]所以利用fft算逆元,處理乘法即可.
//這裡用的fnt,即快速數論變換.
#include #include #include using namespace std;
typedef long long ll;
inline void read(int &x)
const int maxn = 1 << 18;
const int mod = 1004535809;
const int pri_rt = 3;
inline int qpow(int x,int p)
int len;
int e[maxn],ie[maxn];
inline int check(int &x)
inline void init()
for(int m=2;m<=n;m<<=1)
node a,b,c;
int inv[maxn],inv_fac[maxn],c[maxn];
int main()
c[0] = c[1] = 1;
for(int i=2;i<=n;++i) c[i] = qpow(2,(ll)i*(i-1)/2 % (mod - 1));
a.n = b.n = n+1;
for(int i=0;i<=n;++i) a.x[i] = (ll)c[i]*inv_fac[i] % mod;
for(int i=1;i<=n;++i) b.x[i] = (ll)c[i]*inv_fac[i-1]%mod;
get_inv(n+1,a,c);
fill(c.x + c.n,c.x + p,0);
fnt(p,c.x,e);fnt(p,b.x,e);
for(int i=0;i<=p;++i) c.x[i] = (ll)c.x[i]*b.x[i] % mod;
fnt(p,c.x,ie);
int ans = (ll)c.x[n]*qpow(inv_fac[n-1],mod - 2) % mod;
if(ans < 0) ans += mod;
printf("%d\n",ans);
getchar();getchar();
return 0;
}
bzoj3456 城市規劃 多項式,分治
description 剛剛解決完電力網路的問題,阿狸又被領導的任務給難住了.剛才說過,阿狸的國家有n個城市,現在國家需要在某些城市對之間建立一些 路線,使得整個國家的任意兩個城市都直接或間接的連通.為了省錢,每兩個城市之間最多只能有一條直接的 路徑.對於兩個建立路線的方案,如果存在乙個城市對,在兩...
bzoj3456 城市規劃 多項式求In
n 個點的無向聯通圖的個數 打著好累啊 一定要封裝乙個板子 記 c x 為無向圖個數的指數型生成函式,c 0 1 記 g x 為無向聯通圖個數的指數型生成函式,g 0 0 那麼 g x e 從而,c x in g x 複雜度 o n log n include include include inc...
多項式求逆 BZOJ3456 城市規劃
剛剛解決完電力網路的問題,阿狸又被領導的任務給難住了.剛才說過,阿狸的國家有n個城市,現在國家需要在某些城市對之間建立一些 路線,使得整個國家的任意兩個城市都直接或間接的連通.為了省錢,每兩個城市之間最多只能有一條直接的 路徑.對於兩個建立路線的方案,如果存在乙個城市對,在兩個方案中是否建立路線不一...