这个完全图随机定向后是一个竞赛图,将它的强连通分量缩点后我们得到的东西类似一条链,每个点往它后面的所有点连边

在这条链上,我们可以把点划分为两个点集$S,T$使得没有从$T$中点到$S$中点的边($S,T$对应到原图中同样满足条件),那么原图强连通分量个数$=$缩点后的点数$=$划分方案数$+1$,所以期望下的划分方案数$+1$即为答案

令$p_{x,y}$表示$(x,y)$被定向成$x\rightarrow y$的概率(不算非特殊边),那么划分方案数的期望就是$\sum\limits_{S\cup T=V}\prod\limits_{x\in S,y\in T}p_{x,y}$,所以当$m=0$时答案为$\sum\limits_{i=1}^{n-1}\binom ni\left(\frac12\right)^{i(n-i)}$

当$m\neq0$时,我们先硬点每条边的概率为$\frac12$,对于题中给出的那些特殊边,若它的概率为$p$,那么它对概率的贡献为$2p$

对每一个特殊边连接的弱连通块,求出$f_i$表示有$i$个点$\in S$的概率,这里直接枚举弱连通块的每个点属于$S$还是$T$即可,因为有$m$条边的连通块最多有$m+1$个点,所以枚举的时间复杂度为$O(2^m)$

每求完一个弱连通块的$f$,将它和答案$g$卷积即可,最终答案即为$\sum\limits_{i=1}^{n-1}g_i\left(\frac12\right)^{i(n-i)}$

所以说要是做过这个题的话一眼秒掉GDOI2018D1T4应该不成问题...

#include<stdio.h>
#include<string.h>
typedef long long ll;
const int mod=998244353,i2=499122177,i5=595552581;
int mul(int a,int b){return(ll)a*b%mod;}
int pow(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=mul(s,a);
		a=mul(a,a);
		b>>=1;
	}
	return s;
}
void inc(int&a,int b){(a+=b)%=mod;}
int d[40][40],p[40],a[40],b[40],f[40],g[40],h[40],E,M,n;
bool v[40],s[40];
void dfs(int x){
	v[x]=1;
	p[M++]=x;
	for(int i=1;i<=n;i++){
		if(~d[x][i]){
			if(x<i){
				a[E]=x;
				b[E]=i;
				E++;
			}
			if(!v[i])dfs(i);
		}
	}
}
int main(){
	int m,i,j,k,x,y,z,t,S;
	scanf("%d%d",&n,&m);
	memset(d,-1,sizeof(d));
	while(m--){
		scanf("%d%d%d",&x,&y,&z);
		d[x][y]=mul(z,i5);
		d[y][x]=mul(10000-z,i5);
	}
	f[0]=1;
	for(i=1;i<=n;i++){
		if(!v[i]){
			E=M=0;
			dfs(i);
			memset(g,0,sizeof(g));
			for(j=0;j<1<<M;j++){
				S=0;
				for(k=0;k<M;k++)S+=(s[p[k]]=j>>k&1);
				t=1;
				for(k=0;k<E;k++){
					if(s[a[k]]&&!s[b[k]])t=mul(t,d[a[k]][b[k]]);
					if(!s[a[k]]&&s[b[k]])t=mul(t,d[b[k]][a[k]]);
				}
				inc(g[S],t);
			}
			memset(h,0,sizeof(h));
			for(j=0;j<=n-M;j++){
				for(k=0;k<=M;k++)inc(h[j+k],mul(f[j],g[k]));
			}
			memcpy(f,h,sizeof(h));
		}
	}
	t=1;
	for(i=1;i<n;i++)inc(t,mul(f[i],pow(i2,i*(n-i))));
	inc(t,mod);
	printf("%d",mul(t,pow(10000,n*(n-1))));
}

[UOJ181]密码锁的更多相关文章

  1. openjudge8469特殊密码锁[贪心]

    描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你 ...

  2. NOI OpenJudge 8469 特殊密码锁 Label贪心

    描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你 ...

  3. Android 九宫格密码锁进入程序

    设置九宫格密码锁进入程序,设置,重置,取消等,安卓巴士地址http://www.apkbus.com/forum.php?mod=viewthread&tid=182620&extra ...

  4. iOS开发——高级技术&密码锁功能的实现

    密码锁功能的实现 一个ios手势密码功能实现 ipad/iphone 都可以用 没有使用图片,里面可以通过view自己添加 keychain做的数据持久化,利用苹果官方KeychainItemWrap ...

  5. [51nod1357]密码锁

    有一个密码锁,其有N位,每一位可以是一个0~9的数字,开启密码锁需要将锁上每一位数字转到解锁密码一致.这个类似你旅行用的行李箱上的密码锁,密码锁的每一位其实是一个圆形转盘,上面依次标了0,1,...9 ...

  6. 基于VHDL利用PS2键盘控制的电子密码锁设计

    基于VHDL利用PS2键盘控制的密码锁设计 附件:下载地址 中文摘要 摘 要:现代社会,人们的安全意识正在不断提升.按键密码锁由于其具有方便性.低成本等特征,还是大有用武之地的.但是通常的按键密码锁开 ...

  7. poj 8469 特殊密码锁

    a:特殊密码锁 总时间限制: 1000ms 内存限制: 1024kB 描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头 ...

  8. UVa 1631 密码锁

    https://vjudge.net/problem/UVA-1631 题意: 有一个n位密码锁,每位都是0~9,可以循环旋转.每次可以让1~3个相邻数字同时往上或者往下转一格.输入初始状态和终止状态 ...

  9. 【小梅哥FPGA进阶教程】第十二章 数字密码锁设计

    十二.数字密码锁设计 本文由山东大学研友袁卓贡献,特此感谢 实验目的 实现数字密码锁设计,要求矩阵按键输出且数码管显示输入密码,密码输入正确与否均会有相应标志信号产生. 实验平台 芯航线FPGA核心板 ...

随机推荐

  1. TOJ 1005 Hero In Maze (深搜)

    描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他知道公主在迷宫 ...

  2. Linux 内核通知链随笔【中】【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-4364171.html 关于内核通知链不像Netlink那样,既可以用于内核与用户空间的通信,还能用于内核不 ...

  3. python并发模块之concurrent.futures(二)

    python并发模块之concurrent.futures(二) 上次我们简单的了解下,模块的一些基本方法和用法,这里我们进一步对concurrent.futures做一个了解和拓展.上次的内容点这. ...

  4. const 引用的分析

    const 引用: 在初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可.尤其,允许为一个常量引用绑定非常量的对象.字面值,甚至是一个表达式.我们来看 const ...

  5. 广度优先搜索--POJ迷宫问题

    Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...

  6. uoj#35 后缀排序(后缀数组模版)

    #include<bits/stdc++.h> #define N 100005 using namespace std; char s[N]; int a[N],c[N],t1[N],t ...

  7. C基础 时间业务实战代码

    引言 业务代码中遇到这样需求, 1. 二者是同一天吗, 2. 时间戳和时间串来回转, 3. 其它扩展需求 等. C写代码同样需要处理这方面时间问题. 本文就是为了解决这个问题. 相比其它时间库, 这里 ...

  8. tomcat组成介绍和调优方案

    1.tomcat组成介绍 1.1 目录组成介绍 1.2 启动tomcat中遇到的问题 a.启动过程中出现很多异常:因为端口被占用了 解决方式1:修改Tomcat\conf\server.xml中的默认 ...

  9. f1 f12热键关闭

    fn+f2进入bios系统——>找到configuration——>Hotkey Mode——>enter——>选择disable——>fn+f10保存

  10. spring mvc注解文件上传下载

    需要两个包: 包如何导入就不介绍了,前端代码如下(一定要加enctype="multipart/form-data"让服务器知道是文件上传): <form action=&q ...