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的更多相关文章

  1. Codeforces Round #588 (Div. 1) 简要题解

    1. 1229A Marcin and Training Camp 大意: 给定$n$个对$(a_i,b_i)$, 要求选出一个集合, 使得不存在一个元素好于集合中其他所有元素. 若$a_i$的二进制 ...

  2. 学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。

    个人收藏了很多香港大学.香港科技大学以及香港中文大学里专门搞图像研究一些博士的个人网站,一般会不定期的浏览他们的作品,最近在看杨庆雄的网点时,发现他又写了一篇双边滤波的文章,并且配有源代码,于是下载下 ...

  3. LeetCode题解-----Wildcard Matching

    题目描述: '?' Matches any single character. '*' Matches any sequence of characters (including the empty ...

  4. 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 ...

  5. [LeetCode] Wildcard Matching 外卡匹配

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  6. [LeetCode] Regular Expression Matching 正则表达式匹配

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  7. Beginning Scala study note(5) Pattern Matching

    The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...

  8. ios 关于问题 no matching provisioning profiles found

    ios 关于问题 no matching provisioning profiles found

  9. iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)

    从2月14日开始,上传程序的同学可能会遇到提示上传失败的提示. 并且打开自己的钥匙串,发现所有的证书全部都显示此证书签发者无效. 出现以下情况: Failed to locate or generat ...

  10. 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 检查 ...

随机推荐

  1. 《SQLi-Labs》02. Less 6~10

    @ 目录 索引 Less-6 题解 原理 Less-7 题解 Less-8 题解 Less-9 题解 原理 Less-10 题解 sqli.开启新坑. 索引 Less-6:布尔盲注,字符型[" ...

  2. 《Linux基础》01. 概述

    @ 目录 1:Linux的应用领域 1.1:个人桌面领域的应用 1.2:服务器领域 1.3:嵌入式领域 2:Linux介绍 3:Linux和Unix的关系 4:Linux基本规则 Linux介绍 1: ...

  3. 这个 AI 机器人会怼人,它是怎么做到的?

    近期,机器人"Ameca"接入了 Stable Diffusion,它一边与旁边的人类工程师谈笑风生,一边熟练地用马克笔在白板上画出一只简笔的猫,最后还在白板右下角签名. 当 Am ...

  4. ATtiny88初体验(六):SPI

    ATtiny88初体验(六):SPI SPI介绍 ATtiny88自带SPI模块,可以实现数据的全双工三线同步传输.它支持主从两种模式,可以配置为LSB或者MSB优先传输,有7种可编程速率,支持从空闲 ...

  5. Laf 云开发平台及其实现原理

    Laf 产品介绍 自我介绍 大家好,我是来自 Laf 团队的王子俊,很高兴今天能在这里给大家分享我们 Laf 云开发平台及其实现原理.本来想说一点什么天气之类的话作为开头,但主持人都说完啦,我就不多说 ...

  6. Java SE 21 新增特性

    Java SE 21 新增特性 作者:Grey 原文地址: 博客园:Java SE 21 新增特性 CSDN:Java SE 21 新增特性 源码 源仓库: Github:java_new_featu ...

  7. c语言代码练习16

    //计算a,b间的最大值#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int ayue( int a, int b) { if ...

  8. PostgreSQL学习笔记-7.基础知识:子查询、自增、PRIVILEGES 权限

    子查询 子查询或称为内部查询.嵌套查询,指的是在 PostgreSQL 查询中的 WHERE 子句中嵌入查询语句.一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询可以与 SELEC ...

  9. 客制开发tiptop程序随记-pta表结构问题-误删表的恢复

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],-.); 删除字段的语法:alter ...

  10. QUERIES

    这个题解..u1s1我没看懂,但是我觉得这里面有一个重要的思想就是对于像异或这种最终值只是看一个数位的问题,我们可以考虑分解,把每一个子问题单独解决就可以了其实更难的应该是每个子区间的异或和之和这个方 ...