仅仅是对 \(O(n^4)\) 做法的一个记录。

简要题意

有 \(N\) 座岛屿,初始时没有边。每座岛屿都有一个概率值 \(p_i\) 和一个大小为 \(s_i\) 友好列表 \(A_i\) 。

小 \(c\) 站在 \(1\) 号岛屿,依次执行以下操作:

\((1)\) 设现在在岛屿 \(x\),有 \(p_x\) 的概率产生一条图中尚未存在的随机无向边,不会产生自环。

\((2)\) 如果此时所有岛屿仍未联通,她会在当前点的友好列表中,等概率随机选择一个,走到那座岛屿上。并把不满意度增加 \(1\),然后重复 \((1)\)。否则就结束这个过程

求她的期望不满意度,对一个 \(10^9+7\) 取模.

\(n\le 50\).

解题思路

思考后不难发现,状态只与当前的位置,以及边数相关,那么可以设状态:

\(e(x,i)\) 表示现在位于点 \(x\),图还差 \(i\) 条边连通,已经走的期望步数。

则最终答案是:

\[Ans = \sum_{i=1}^me(1, i)\cdot P(\text{恰好 }i\text{ 条边连通的概率})
\]

不难得到 \(e\) 之间的转移式:

\[e(x,i)=1+\frac{1}{s_x}\sum_{x\rightarrow y}p_x\cdot e(y,i-1)+(1-p_x)\cdot e(y,i)
\]

如果分层高斯消元是 \(O(n^5)\),考虑设 \(e(x,i)=c(x)+\sum b(x,y)\cdot e(y,i-1)\) 来递推解决。

带入转移式可得:

\[\begin{aligned}
e(x,i)=1+\frac{1}{s_x}\sum_{x\rightarrow y}p_x\cdot e(y,i-1)+(1-p_x)\cdot (\sum_{z=1}^nc(y)+b(y,z)\cdot e(z,i-1))\\
e(x,i)=1+\frac{p_x}{s_x}\sum_{x\rightarrow y}e(y,i-1)+\frac{(1-p_x)}{s_x}\cdot \sum_{x\rightarrow y}(c(y)+\sum_{z=1}^nb(y,z)\cdot e(z,i-1))\\
e(x,i)=1+\frac{(1-p_x)}{s_x}\cdot \sum_{x\rightarrow y}^nc(y)+\frac{p_x}{s_x}\sum_{x\rightarrow y}e(y,i-1)+\frac{(1-p_x)}{s_x}\cdot \sum_{x\rightarrow y}\sum_{z=1}^nb(y,z)\cdot e(z,i-1)\\
\end{aligned}
\]

于是可以得到两个方程:

\[c(x)=1+\frac{(1-p_x)}{s_x}\cdot \sum_{x\rightarrow y}^nc(y)
\]
\[b(x,z)=\frac{p_x}{s_x}[x\rightarrow z]+\frac{1-p_x}{s_x}\sum_{x\rightarrow y}b(y,z)
\]

这样就可以在 \(O(n^4)\) 的高斯消元内得到所有的 \(b,c\),然后递推得到 \(e(1,i)\)。


接下来考虑如何计算恰好 \(i\) 条边连通的概率,其实要算的就是 \(n\) 个点 \(i\) 条边连通图的方案数。

这类问题的经典处理方式是用斯特林反演来容斥。

于是考虑划分连通块,不同块之间的边不能选择,同一块内的边可选可不选。

这样实际连通块为 \(t\) 的图会在连通块为 \(k\) 的图时算到 \(\begin{Bmatrix}t\\k\end{Bmatrix}\) 次,乘上系数 \((-1)^{k-1}(k-1)!\) ,求和得到连通图。

所以 \(i\) 条边, \(n\) 个点的连通图数量实际上为:

\[\sum_{G}(-1)^{c(G)-1}(c(G)-1)!{e(G) \choose i}
\]

其中 \(G\) 需要取遍所有的 \(n\) 个点的,划分成了若干连通块的,每个连通块内连成了完全图的图,\(c(G)\) 表示 \(G\) 的连通块数量,\(e(G)\) 表示 \(G\) 的边数。

设 \(dp_{i,j}\) 表示 \(i\) 个点,划分成了若干连通块,每个连通块内部连成完全图后边数和为 \(j\),的所有图带上容斥系数的 \((-1)^{c(G)-1}(c(G)-1)!\) 之和。

然后考虑一下怎么把系数带上。首先正常的选一个连通块, 然后固定一号连通块在最前面, 然后接着选的时候, 每次不区分选连通块的顺序。那么在转移的时候,考虑下一个连通块的东西是 \(k\),重标号的系数就是 \(\binom{i+k-1}{k}\),因为 1 号连通块不能乱排,那么就可以钦定 1 号连通块最前面那个点一直不参与重标号, 于是每种划分方式就会算 \((k-1)!\) 种。

这样可以 \(O(n^4)\) 计算出 \(dp_{n,i}\) ,然后 \(O(n^4)\) 直接算出 \(g_i\),表示 \(n\) 个点 \(i\) 条边的连通图个数。

namespace Gauss{
int n, a[N][N], b[N];
inline int get(int x){ return (LL) b[x] * qpow(a[x][x], mod - 2) % mod; }
void init(int m){
n = m;
lfor(i, 1, n) b[i] = 0;
lfor(i, 1, n) lfor(j, 1, n) a[i][j] = 0;
}
void solve(){
lfor(i, 1, n){
int inv = qpow(a[i][i], mod - 2);
lfor(j, 1, n) if(i != j){
int K = (LL) inv * a[j][i] % mod;
lfor(k, 1, n) MOD(a[j][k] -= (LL) K * a[i][k] % mod);
MOD(b[j] -= (LL) K * b[i] % mod);
}
}
}
}
using Gauss :: get;
using Gauss :: init;
using Gauss :: solve; void get_coef(){
init(n);
lfor(x, 1, n){
Gauss :: b[x] = mod - 1;
Gauss :: a[x][x] = mod - 1;
int v = (LL) q[x] * qpow(s[x], mod - 2) % mod;
lfor(j, 1, s[x]) Gauss :: a[x][a[x][j]] = v;
}
solve();
lfor(x, 1, n) c[x] = get(x); lfor(z, 1, n){
init(n); lfor(x, 1, n){
int v = (LL) q[x] * qpow(s[x]) % mod;
if(lnk[x][z]) Gauss :: b[x] = Mod(-(LL) p[x] * qpow(s[x]) % mod);
Gauss :: a[x][x] = mod - 1;
lfor(y, 1, n) if(lnk[x][y]) Gauss :: a[x][y] = v;
} solve();
lfor(x, 1, n) b[x][z] = get(x);
} lfor(i, 1, m) lfor(x, 1, n){
lfor(y, 1, n) MOD(e[x][i] += (LL) b[x][y] * e[y][i - 1] % mod - mod);
MOD(e[x][i] += c[x] - mod);
}
} void get_prob(){
lfor(i, 1, n) dp[i][C(i, 2)] = 1;
lfor(i, 1, n) lfor(j, 0, m) if(dp[i][j]) lfor(k, 1, n - i)
MOD(dp[i + k][j + C(k, 2)] += -(LL) dp[i][j] * C(i + k - 1, k) % mod);
lfor(i, 0, m) lfor(j, i, m)
MOD(g[i] += (LL) dp[n][j] * C(j, i) % mod - mod);
lfor(i, 1, m) g[i] = (LL) g[i] * qpow(C(m, i), mod - 2) % mod;
rfor(i, m, 1) MOD(g[i] -= g[i - 1]);
} signed main(){
read(n), m = n * (n - 1) / 2;
lfor(i, 1, n) read(p[i]), q[i] = Mod(1 - p[i]);
lfor(i, 1, n){
read(s[i]), a[i] = new int[s[i] + 1];
lfor(j, 1, s[i]) read(a[i][j]), lnk[i][a[i][j]] = 1;
} prep();
get_coef();
get_prob(); lfor(i, 1, m) MOD(Ans += (LL) e[1][i] * g[i] % mod - mod);
cout << Mod(Ans - 1) << endl;
return 0;
}

[题解][YZOJ50074] 小 C 的岛屿的更多相关文章

  1. 【题解】小X的AK计划

    题目描述 虽然在小X的家乡,有机房一条街,街上有很多机房.每个机房里都有一万个人在切题.小X刚刷完CodeChef,准备出来逛逛.机房一条街有n个机房,第i个机房的坐标为xi,小X的家坐标为0.小X在 ...

  2. 题解 P3951 小凯的疑惑

    P3951 小凯的疑惑 数论极菜的小萌新我刚看这题时看不懂exgcd做法的题解,后来在网上找到了一篇博客,感觉代码和推导都更加清新易懂,于是在它的基础上写了题解qwq 分析 两数互质,且有无限个,想到 ...

  3. 「题解」小 R 打怪兽 monster

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目描述 小 R 最近在玩一款游戏.在游戏中,小 R 要依次打 \(n\) 个怪兽,他需要打败至少 \(k\) 个怪兽才能通关.小 ...

  4. 【题解】小Z的袜子

    期末考试结束了,来写写blog吧 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具 ...

  5. 联赛膜你测试20 T1 Simple 题解 && NOIP2017 小凯的疑惑 题解(赛瓦维斯特定理)

    前言: 数学题,对于我这种菜B还是需要多磨啊 Simple 首先它问不是好数的数量,可以转化为用总数量减去是好数的数量. 求"好数"的数量: 由裴蜀定理得,如果某个数\(i\)不能 ...

  6. 【题解】小M的作物

    题目戳我 \(\text{Solution:}\) 这题要求最大收获,可以转化为所有可能的收益减去最小割. 单个点很好连边 \((S\to pos\to T),\) 问题在于如何处理组合的点. 观察到 ...

  7. 【题解】 P1373 小a和uim之大逃离

    题解 P1373 小a和uim之大逃离 传送门 一道dp好题 乍看此题,感觉要这样设计: \(dp(x)(y)(mod_{a})(mod_{uim})(0/1)\) , 但是我上午考试就MLE了,赶紧 ...

  8. bzoj5044: 岛屿生成

    Description 小Q设计了一款2D游戏,它的地图建立在二维笛卡尔坐标系上.这个游戏最大的特色就是可以随机生成地图,但是 岛屿生成却给小Q带来了巨大的麻烦.一个岛屿可以看成一个恰好有n个顶点的简 ...

  9. 贪心(qwq)习题题解

    贪心(qwq)习题题解 SCOI 题解 [ SCOI2016 美味 ] 假设已经确定了前i位,那么答案ans一定属于一个区间. 从高位往低位贪心,每次区间查找是否存在使此位答案为1的值. 比如6位数确 ...

随机推荐

  1. 数据库连接(Database link)?

    在一个用户下,可以获取到另外的用户下的表的数据,通常在跨数据库时使用. create database link link93 connect to scott identified by tiger ...

  2. Java Output流写入包装问题

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); OutputStreamWriter output ...

  3. JWT jti和kid属性的说明

    jti chaim=== JWT ID " jti"(JWT ID)声明为JWT提供了唯一的标识符. 标识符值的分配方式必须确保将相同值偶然分配给不同数据对象的可能性可以忽略不计: ...

  4. vue项目给less传递参数,出现 Invalid options object. Less Loader has been initialized using an options object that does not match the API schema.

    vue-cli创建的项目,想使用less-loader的全局变量配置,但是配置(vue.config.js文件)项出现 error in ./src/components/BookFooter.vue ...

  5. We're sorry but demo3 doesn't work properly without JavaScript enabled. Please enable it to continue.

    今天遇到一个问题为 vue请求得到的响应为 We're sorry but demo3 doesn't work properly without JavaScript enabled. Please ...

  6. Tomcat警告之“资源添加到Web应用程序[]的缓存中,因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间”

    原因 缓存不够,可以将其缓存调大 解决办法: 在 /conf/context.xml 的 前添加以下内容: <Resources cachingAllowed="true" ...

  7. python爬虫---爬取网易云音乐

    代码: import requests from lxml import etree text = requests.get("https://music.163.com/discover/ ...

  8. 安装PLSQLDeveloper

    1.点击.exe开始安装 2.选择安装路径点击下一步 3.点击finish 4.注册  ,打开新安装的plsql 如下: 点击关闭(现在是登录不上的) 点击help->Register 如下: ...

  9. PL/SQL中的 not

    ELECT * FROM table_name WHERE column_name not like'%山%' 這時出現了column_name中為null值的情況也被剔掉了. 原因是:在SQL的表達 ...

  10. vue引入swiper

    https://github.com/surmon-china/vue-awesome-swiper/blob/master/examples/03-pagination.vue https://su ...