講課時候一點兒都沒懂
分成兩個部分:
找到所有滿足sum<=mx的集合,即列舉哪些是great的、統計每個great的集合對應多少個樹
發現,第二個部分只和great集合大小有關
具體的第乙個部分:折半爆搜+sort+雙指標,得到g[i]大小為i的great集合個數
第二部分:
f[i]表示欽定i個是great的生成樹個數
答案=∑f[i]*g[i]
求f[i]?
不妨欽定1~i為great
完全圖,把所有連線至少乙個good的邊去掉,矩陣樹定理求生成樹
這樣得到了至多有i個great的個數h
減去孤立的:
則f[i]=h-∑0<=j即可。
#include#define reg register int#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<#define pii pairusing
namespace
std;
typedef
long
long
ll;template
il void rd(t &x)
template
il void output(t x)
template
il void ot(t x)
template
il void prt(t a,int st,int nd)
namespace
miracle
int mul(int x,int
y)int qm(int x,int
y)
return
ret;
}int
val[n];
int pre[(1
<<20)+233][21
];struct
po po(
int ss,int size)
bool friend operator
<(po a,po b)
}p[2
][m];
int cnt[2
];void dfs(int x,int lim,int lp,int sz,int
sum)
if(val[x]<0) dfs(x+1
,lim,lp,sz,sum);
else
}int
t[n][n];
int guass(int f[n][n],int
n)cout;
for(reg i=1;i<=n;++i)
}if(id==0) return0;
if(id!=i)
int inv=qm(f[i][i],mod-2
);
for(reg j=i+1;j<=n;++j)}}
}ll ret=ad(mod,tmp);
for(reg i=1;i<=n;++i) ret=mul(ret,f[i][i]);return
ret;
}int
g[n],f[n];
void
clear()
intmain()
}while(t--)
int half=n/2
; dfs(
1,half,0,0,0
); sort(p[
0]+1,p[0]+cnt[0]+1
);
for(reg i=1;i<=cnt[0];++i)
dfs(half+1,n,1,0,0
); sort(p[
1]+1,p[1]+cnt[1]+1
);
int ptr=cnt[0
];
for(reg i=1;i<=cnt[1];++i)
}for(reg i=0;i<=m;++i)
for(reg j=i+1;j<=m;++j)
for(reg j=m+1;j<=n;++j)
for(reg j=1;j<=n;++j)
}f[i]=guass(t,n-1
);
//cout<<" st "}
ll ans=0
;
//prt(g,0,m);
//prt(f,0,m);
for(reg i=0;i<=m;++i)
printf(
"%lld\n
",ans);
if(t) clear();
}}}signed main()
/*author: *miracle*
*/
51nod 1446 限制價值樹
有n個點 n 40 標記為0,1,2,n 1,每個點i有個價值val i 如果val i 1那麼這個點被定義為bad,否則如果val i 0那麼這個點為定義為good。現在給這n個點間連上n 1條邊,使它們構成乙個生成樹,定義樹中的點為great點當且僅當這個點本身是good點且與其相鄰的點中至少有...
51nod 1446 價值限制樹
51nod 1446 價值限制樹 真 一調一下午。題意 給 n 個點,每個點有權值 a i 若 a i 1 稱這個點 not good 否則是 good 的。形成任意一棵生成樹後若 good 的點相鄰的點有 good 點,則稱該點是 great 的。生成樹的價值是所有 great 的點的權值和。給定...
51Nod 1296 有限制的排列
acm模版 個人感覺,這個應該算是數字 dp。先通過處理輸入資料獲取乙個 state,表示每相鄰兩項之間的大小關係,state i 0,表示無特別關係,state i 1 表示第 i 項小於第 i 1 項,state i 2 表示第 i 項大於第 i 1 項。接著搞乙個 dp i j 表示由前 i ...