[CF1229E]Marek and Matching
This is a harder version of the problem. In this version, \(n \le 7\).
Marek is working hard on creating strong test cases to his new algorithmic problem. Do you want to know what it is? Nah, we're not telling you. However, we can tell you how he generates test cases.
Marek chooses an integer \(n\) and \(n^2\) integers \(p_{ij}\) (\(1 \le i \le n\), \(1 \le j \le n\)). He then generates a random bipartite graph with \(2n\) vertices. There are \(n\) vertices on the left side: \(\ell_1, \ell_2, \dots, \ell_n\), and \(n\) vertices on the right side: \(r_1, r_2, \dots, r_n\). For each \(i\) and \(j\), he puts an edge between vertices \(\ell_i\) and \(r_j\) with probability \(p_{ij}\) percent.
It turns out that the tests will be strong only if a perfect matching exists in the generated graph. What is the probability that this will occur?
It can be shown that this value can be represented as \(\frac{P}{Q}\) where \(P\) and \(Q\) are coprime integers and \(Q \not\equiv 0 \pmod{10^9+7}\). Let \(Q^{-1}\) be an integer for which \(Q \cdot Q^{-1} \equiv 1 \pmod{10^9+7}\). Print the value of \(P \cdot Q^{-1}\) modulo \(10^9+7\).
\(n\le 7\),是一个很暴力的范围。
但是怎么暴力?
我们在搜索的过程中,如何很好的维护出最大匹配的信息?
考虑维护每一个左端点集合是否存在最大匹配,然后每次新增一个左端点,枚举这个点能到的集合,设为 \(s\),可以预处理出概率。然后再更新那些有最大匹配的概率。复杂度明显是爆的。
略微优化一下搜索过程,在搜索时处理出这个左端点如果连到了点 \(i\) 会有哪些最大匹配改变,可以用 __int128 状压,记为 \(f_i\)。然后枚举对应的集合时可以直接把所有 \(f_j(j\in s)\) 或起来就可以了。
可以考虑记忆化,用一个状压记录每个集合是否有最大匹配(状压的状压?有点绕)。然后就过了。记录的时候可以用一个 __int128 记到 map 里面,然后就可以过了。
#include<bits/stdc++.h>
using namespace std;
typedef unsigned __int128 LL;
const int N=10,P=1e9+7,S=1<<N;
int pown(int x,int y)
{
if(!y)
return 1;
int t=pown(x,y>>1);
if(y&1)
return 1LL*t*t%P*x%P;
return 1LL*t*t%P;
}
int n,p[N][N],f[N][S],cnt;
map<LL,int>mp[N];
LL mx;
void write(LL x)
{
if(!x)
return;
write(x/10);
putchar(x%10+48);
}
int dfs(int x,LL s)
{
/*printf("%d ",x),write(s);
puts("");*/
if(x==n)
{
return s==mx;
}
if(mp[x].find(s)!=mp[x].end())
return mp[x][s];
++cnt;
LL f[N];
for(int i=0;i<n;i++)
f[i]=0;
int ans=0;
for(int i=0;i<(1<<n);i++)
{
if(s>>i&1)
for(int k=0;k<n;k++)
f[k]|=((LL)1)<<(i|(1<<k));
}
for(int i=1;i<(1<<n);i++)
{
LL to=s;
for(int j=0;j<n;j++)
if(i>>j&1)
to|=f[j];
ans+=dfs(x+1,to)*1LL*::f[x][i]%P;
if(ans>=P)
ans-=P;
}
return mp[x][s]=ans;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<(1<<n);i++)
mx|=((LL)1)<<i;
int pw=pown(100,P-2);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",p[i]+j),p[i][j]=1LL*p[i][j]*pw%P;
for(int i=0;i<n;i++)
{
for(int j=0;j<(1<<n);j++)
{
f[i][j]=1;
for(int k=0;k<n;k++)
{
if(j>>k&1)
f[i][j]=1LL*f[i][j]*p[k][i]%P;
else
f[i][j]=1LL*f[i][j]*(1+P-p[k][i])%P;
}
}
}
printf("%d",dfs(0,1));
}
[CF1229E]Marek and Matching的更多相关文章
- Codeforces Round #588 (Div. 1) 简要题解
1. 1229A Marcin and Training Camp 大意: 给定$n$个对$(a_i,b_i)$, 要求选出一个集合, 使得不存在一个元素好于集合中其他所有元素. 若$a_i$的二进制 ...
- 学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。
个人收藏了很多香港大学.香港科技大学以及香港中文大学里专门搞图像研究一些博士的个人网站,一般会不定期的浏览他们的作品,最近在看杨庆雄的网点时,发现他又写了一篇双边滤波的文章,并且配有源代码,于是下载下 ...
- LeetCode题解-----Wildcard Matching
题目描述: '?' Matches any single character. '*' Matches any sequence of characters (including the empty ...
- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'mvc:annotation-driven'.
spring 配置文件报错报错信息:cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be ...
- [LeetCode] Wildcard Matching 外卡匹配
Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...
- [LeetCode] Regular Expression Matching 正则表达式匹配
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- Beginning Scala study note(5) Pattern Matching
The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...
- ios 关于问题 no matching provisioning profiles found
ios 关于问题 no matching provisioning profiles found
- iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
从2月14日开始,上传程序的同学可能会遇到提示上传失败的提示. 并且打开自己的钥匙串,发现所有的证书全部都显示此证书签发者无效. 出现以下情况: Failed to locate or generat ...
- ORA-12516:TNS:listener could not find available handler with matching protocol stack
应用程序连接测试数据库时报ORA-12516:TNS:listener could not find available handler with matching protocol stack 检查 ...
随机推荐
- 5、Spring之bean的作用域和生命周期
5.1.bean的作用域 5.1.1.单例(默认且常用) 5.1.1.1.配置bean 注意:当bean不配置scope属性时,默认是singleton(单例) <?xml version=&q ...
- Web通用漏洞--sql注入
SQL注入 mysql注入目的:获取当前web权限 mysql注入--常规查询&union联合查询 MYSQL--Web组成架构 服务器搭建web服务可能存在多个站点搭建在一台服务器中,数据集 ...
- 《SQL与数据库基础》16. 锁
目录 锁 全局锁 表级锁 表锁 元数据锁 意向锁 行级锁 行锁 间隙锁 临键锁 本文以 MySQL 为例 锁 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU. ...
- OpenCASCADE 显示对象设置不可选中
原有的选中模式代码: static Standard_Integer SelectionMode (const TopAbs_ShapeEnum theShapeType) { switch (the ...
- java正则表达式过滤工具类
正则表达式过滤工具类 import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @Description : * @D ...
- Avalonia开发(二)项目结构解析
一.前言 在Avalonia开发(一)环境搭建 文章中介绍了Avalonia的介绍.开发环境的搭建.项目创建,以及项目FirstAvaloniaApp项目结构的介绍.本篇文章将介绍各平台的项目介绍. ...
- Solution -「SP 106」BINSTIRL
Description Link. 求 \(\begin{Bmatrix}n \\ m\end{Bmatrix}\bmod2\) Solution 求 \[\begin{aligned} \begin ...
- 【Redis】SpringBoot集成Redis事务-亲测
大家好,我是mep.今天一起来探讨一下Redis缓存的问题,SpringBoot如何集成Redis网上文章很多,基本都是介绍如何配置redisTemplate,如何调用,本文就不过多介绍了.这次我们研 ...
- 若依框架的startPage( )函数怎么自动关联查询SQL语句?
Question Description 使用JAVA语言的若依框架的时候,发现只要使用了startPage()函数, 并不需要前端传递分页的数据,也不需要注解,就能完成分页功能.预判他应该是使用类似 ...
- java数组的定义和使用规范
java数组 三种定义方式 1.数组类型[] 数组名字 = new 数组类型[数组长度] String[] str = new String[n]; //这里n代表数组的长度可变 //另外上面这种写法 ...