日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解

發布時間:2023/12/6 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.lydsy.com/JudgeOnline/problem.php?id=4596

https://www.luogu.org/problemnew/show/P4336#sub

四年一度的幻想鄉大選開始了,最近幻想鄉最大的問題是很多來歷不明的妖怪涌入了幻想鄉,擾亂了幻想鄉昔日的秩序。但是幻想鄉的建制派妖怪(人類)博麗靈夢和八云紫等人整日高談所有妖怪平等,幻想鄉多元化等等,對于幻想鄉目前面臨的種種大問題卻給不出合適的解決方案。 風間幽香是幻想鄉里少有的意識到了問題的嚴重性的大妖怪。她這次勇敢的站了出來參加幻想鄉大選。提出包括在幻想鄉邊境建墻(并讓人類出錢),大力開展基礎設施建設挽回失業率等一系列方案,成為了大選年出人意料的黑馬并順利的當上了幻想鄉的大統領。 幽香上臺以后,第一項措施就是要修建幻想鄉的公路。幻想鄉有 N 個城市,之間原來沒有任何路。幽香向選民承諾要減稅,所以她打算只修 N- 1 條路將這些城市連接起來。但是幻想鄉有正好 N- 1 個建筑公司,每個建筑公司都想在修路的過程中獲得一些好處。雖然這些建筑公司在選舉前沒有給幽香錢,幽香還是打算和他們搞好關系,因為她還指望他們幫她建墻。所以她打算讓每個建筑公司都負責一條路來修。 每個建筑公司都告訴了幽香自己有能力負責修建的路是哪些城市之間的。所以幽香打算選擇 N-1 條能夠連接幻想鄉所有城市的邊,然后每條邊都交給一個能夠負責該邊的建筑公司修建,并且每個建筑公司都恰好修一條邊。 幽香現在想要知道一共有多少種可能的方案呢?兩個方案不同當且僅當它們要么修的邊的集合不同,要么邊的分配方式不同。

看了矩陣樹教程它讓我做這道題http://www.cnblogs.com/zj75211/p/8039443.html。

深感自己老齡化嚴重。

n<=17顯然是要壓狀態了,那我們只能壓是否選擇每個公司來建邊了……好像和題意不符啊。

但是思考,事實上我們要求的東西可以通過容斥來表達出來,即(不考慮哪些公司建哪些邊)我加所有公司的邊的方案數-我少一個公司的所有邊的方案數+……最后反正是把所有不合法的方案都剔除出去了。

那么我們枚舉狀態,用矩陣樹定理求出生成樹個數就是方案了,之后再加加減減就行了。

#include<cstdio> #include<queue> #include<cstring> #include<cmath> #include<cctype> #include<algorithm> using namespace std; typedef long long ll; const int p=1e9+7; const int N=18; inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } ll x[N][N],ans; ll gauss(int n){ll res=1;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){while(x[j][i]!=0){ll t=x[i][i]/x[j][i];for(int k=i;k<=n;k++)x[i][k]=(x[i][k]-x[j][k]*t)%p;for(int k=i;k<=n;k++)swap(x[i][k],x[j][k]);res=-res;}}if(!x[i][i])return 0;res=(res*x[i][i])%p;}return (res%p+p)%p; } int n,m[N],u[N][N*N],v[N][N*N],d[N]; int main(){n=read();for(int i=1;i<n;i++){m[i]=read();for(int j=1;j<=m[i];j++){u[i][j]=read(),v[i][j]=read();}}for(int i=(1<<(n-1))-1;i>=0;i--){int tot=0;memset(x,0,sizeof(x));memset(d,0,sizeof(d));for(int j=1;j<n;j++){int w=(i>>(j-1))&1;if(w){for(int k=1;k<=m[j];k++){x[u[j][k]][v[j][k]]--;x[v[j][k]][u[j][k]]--;d[u[j][k]]++;d[v[j][k]]++;}for(int k=1;k<=n;k++)x[k][k]=d[k];tot++;}}ll tmp=gauss(n-1);if((n-1-tot)%2==0)ans=(ans+tmp)%p;else ans=(ans-tmp)%p;}printf("%lld\n",(ans%p+p)%p);return 0; }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/?+

+++++++++++++++++++++++++++++++++++++++++++

轉載于:https://www.cnblogs.com/luyouqi233/p/8980839.html

總結

以上是生活随笔為你收集整理的BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。