设 $f_i$ 表示 $i$ 个节点有标号连通图个数
$g_i$ 表示 $i$ 个节点有标号图个数,这个显然就是 $2^{\frac{n(n-1)}2}$
考虑 $f_i$ 的转移,直接转移不太好搞,考虑补集转化,用 $g_i$ 减去不连通图个数
枚举 $1$ 号节点所在连通块节点个数,$f_i=g_i-\sum_{j=1}^{i-1} \binom{i-1}{j-1}f_jg_{i-j}$
时间复杂度 $O(N^2)$,注意要写高精度
#include<bits/stdc++.h>
using namespace std;
const int N=51;
struct Int
{
vector<int> num;
int size() { return num.size(); }
int back() { return num.back(); }
void resize(int x) { num.resize(x); }
int& operator [](int x) { return num[x]; }
void push_back(int x) { return num.push_back(x); }
void pop_back() { num.pop_back(); }
void init(string s) {
for (char c:s) num.push_back(c&15);
reverse(num.begin(),num.end() );
}
void print() {
for (int i=num.size()-1;~i;i--)
putchar(num[i]|48);
}
friend Int operator +(Int a,Int b)
{
Int c; int t=0;
if (a.size()<b.size() ) swap(a,b);
for (int i=0;i<a.size();i++) {
t+=a[i]; if (i<b.size() ) t+=b[i];
c.push_back(t%10),t/=10;
}
if (t) c.push_back(t);
return c;
}
friend Int operator -(Int a,Int b)
{
Int c;
for (int i=0,t=0;i<a.size();i++) {
t+=a[i]; if (i<b.size() ) t-=b[i];
c.push_back( (t+10)%10),t=t<0?-1:0;
}
while (c.size()>1&&!c.back() ) c.pop_back();
return c;
}
friend Int operator *(Int a,Int b)
{
Int c;
c.resize(a.size()+b.size() );
for (int i=0;i<a.size();i++)
for (int j=0;j<b.size();j++)
c[i+j]+=a[i]*b[j];
for (int i=0;i<c.size();i++)
if (c[i]>9) c[i+1]+=c[i]/10,c[i]%=10;
if (c.size()>1&&!c.back() ) c.pop_back();
return c;
}
friend Int operator ^(Int a,int b)
{
Int ans;
ans.init("1");
while (b) {
if (b&1) ans=ans*a;
a=a*a,b>>=1;
}
return ans;
}
}f[N],g[N],two,C[N][N];
int main()
{
two.init("2");
for (int i=0;i<N;i++) g[i]=two^(i*(i-1)/2);
for (int i=0;i<N;i++)
for (int j=0;j<=i;j++) {
if (!j) C[i][j].init("1");
else C[i][j]=C[i-1][j]+C[i-1][j-1];
}
for (int i=1;i<N;i++) {
f[i]=g[i]; for (int j=1;j<i;j++)
f[i]=f[i]-C[i-1][j-1]*f[j]*g[i-j];
}
int n; bool _=false;
while (cin>>n) {
if (_) putchar('\n');
f[n].print(),_=true;
}
return 0;
}
顺便放一个打表做法(
#include<bits/stdc++.h>
using namespace std;
string ans[50]={
"1",
"1",
"4",
"38",
"728",
"26704",
"1866256",
"251548592",
"66296291072",
"34496488594816",
"35641657548953344",
"73354596206766622208",
"301272202649664088951808",
"2471648811030443735290891264",
"40527680937730480234609755344896",
"1328578958335783201008338986845427712",
"87089689052447182841791388989051400978432",
"11416413520434522308788674285713247919244640256",
"2992938411601818037370034280152893935458466172698624",
"1569215570739406346256547210377768575765884983264804405248",
"1645471602537064877722485517800176164374001516327306287561310208",
"3450836972295011606260171491426093685143754611532806996347023345844224",
"14473931784581530777452916362195345689326195578125463551466449404195748970496",
"121416458387840348322477378286414146687038407628418077332783529218671227143860518912",
"2037032940914341967692256158580080063148397956869956844427355893688994716051486372603625472",
"68351532186533737864736355381396298734910952426503780423683990730318777915378756861378792989392896",
"4586995386487343986845036190980325929492297212632066142611360844233962960637520118252235915249481987129344",
"615656218382741242234508631976838051282411931197630362747033724174222395343543109861028695816566950855890811486208",
"165263974343528091996230919398813154847833461047104477666952257939564080953537482898938408257044203946031706125367800496128",
"88725425253946309579607515290733826999038832348034303708272765654674479763074364231597119435621862686597717341418971119460584259584",
"95268202520385449790227094691687836722278710954949736428196756305746453532341035148366531266372862653739009088659598082113309304400438624256",
"204586909944926298207861553173799965921067126517774603507480126827588404754232387878919170016875623577048105576068684204467114231315623298308706926592",
"878694093745349914731889727208157807680003171098920968952145189548012830636076748530741378813207711246134152874638123892704663922045456803250047261786444398592",
"7547924819767483287594694542205326068855891655862820018679189530528628155893698967796630219069788201405972928386025644172169109953194652176102437455457970998547197198336",
"129672361263353660216004848405397154497075914498088480263529787446798464815868889966259599220355751574955667311875199310825316757090836792227021420332597263591744872066219249762304",
"4455508410978470003213152055317479855991723332650114280703483486331017198541367912550307040027205813596014620050254013798901452927850711294962075802234712748298505435020109941966616435621888",
"306180206751230090930313674296749763317292930219833760674864513181351793147422958983304199997791891477494238067606067864147691875149221011750587805454462256284237767964756224079011437145490032917741568",
"42081087200752140195116730773102052524009718837902621183664949269856744858385083976643391056195246283737633254986683196506525739229100562028667655727478159896469450443625002559600024194689577683162985133342982144",
"11567161173227696466220457283329529101751379197153495724502457893891478829937149071434453800538222228465001645119757350054456753856800058471020811256328606811309950183460999195585736337722940242137574318489684508433109221376",
"6359114105601017351375465630036218352726964545083913061809864302427743340641476112983635151514041188995967358659226381513838435962182371853731281705837980150384424607870600516842502175922529566100381861494213531965265765000213275082752",
"6991919901710702396948942815573257427744311018004588489866790612959056357721564695830748688904669995738081555372234543689358610668809196548322563461899302515136978058611651369187392760821440875968116963440793130046454847480988052748303630065467392",
"15375394465098365435098131065240195173750887603455691084898736566282027607324662718653380384318359771738669872579070523864682029424324656980343742654131923883848453279046887366030428581980234722002609397042921130626427482776226373410811403774539364168814821376",
"67621699984704009571087635348261788647460730411971168452281282746962798999895717916292043207408657855232972628889146834646084600650980317820241001687549180689983916950502853108787655643356237905731863505593837387547463783553663104052737827256888296815897621036524900450304",
"594806763388137870319868932592503661181879874998563369872608575294390559331829154567126246824792929668641338543467328561106071308881273503814138669414317911219402066314092130747535752627679688399993515689603622744525243838714230998285264232171322066511990049433899384262102238508351488",
"10463951242026625501784363274596214619943325701401522513836100192928357652762255136769619473700702276949844553770347735730521468871772581157963359677917896206658361141741863952608795675733168160935829452838892433190712974942475048711118429563334205007874224852816312589287727030417085994911901155328",
"368167554019320956145827247050509963076959450983143444578072117098399777382502455552633802915095691807005512740224345254318634273382517137823997743877511866703540358482988273801636313118482363728678083259725882776454656507629131210255280738244476783496709369751571318821222548711309212127848471930415455355797504",
"25907488423318455274080473672019976083009208996271003791416218114322853582878049179546761491016196610119349803222490393175612695149120594742502991139032865749979736985340247224801444473477196529096332604358326020598992443433363048888842556850935198901353471923472154386768107635993449205071378228596636214817388982756553261056",
"3646154850293767810262810894999553363628589110640769385457986485984919161321600546344826908488589572223649058216506920510786720770519258252897810249930214560211056122090333850686659187132094273815095247787669459869137017783625755540375408272361426098383313551230976557640520636974573279383371834513917048967432546435999569365350430111956992",
"1026301351570055077911628972867042177680735585635225345203536190737910863123857244548313982876228994987864700400759811456244128889754306386459557887432298148719591734971030611474690885904247396313959818854940592795291449937598794070517570167551607950979266237997797283563645242105244737520881371410960067902176629829514256225641238164014573644333472284672",
"577756298062641319815321284633539861082132919998722885657507672188606317696301924134068233518707877841769252356274834883678320922291785288952259324960085933885572481476441044041666245632947630667669900623389069655523344952222114179660086674251300523449279256078271770682664276058349275922600493471476178420154378012048571333436567365397136152469165480980158369042006016"
};
int main()
{
cin.tie(0),cout.tie(0);
int n; while (cin>>n,n)
cout<<ans[n-1]<<endl;
return 0;
}
很难看出这是小学生写的题解