【UOJ#75】【UR #6】智商锁(矩阵树定理,随机)
【UOJ#75】【UR #6】智商锁(矩阵树定理,随机)
题面
题解
这种题我哪里做得来啊[惊恐],,,
题解做法:随机\(1000\)个点数为\(12\)的无向图,矩阵树定理算出它的生成树个数,然后找到四张图不拼接直接放在一起,也就是找到四个图,假设其生成树个数是\(f(G)\),那么就找到\(f(G_1)f(G_2)f(G_3)f(G_4)\equiv k\),然后预处理两两的乘积,丢到哈希表/\(\text{map}\)里,枚举另外一半直接查。。。
无向图的生成方式是每条边出现的概率是\(0.8\)。然后\(rand\)的时候确保图连通。
还需要再特判一下\(k=0\)的情况。
然后概率的证明直接蒯题解吧。。。
首先我们随机无向图的方法是每一条边生成的概率都是\(0.8\),而\(12\)个点的完全图的生成树个数是\(12^{10}\),这是远大于模数的,所以我们可以近似地把\(f_i\)看做均匀分布的随机数(这个和我们平时写的哈希表的思想类似)。接下来我们把这\(1000\)个随机数的集合四次方再模上模数,这样我们就得到了\(10^{12}\)个数,和刚才同理,我们也可以把这\(10^{12}\)个数给近似地看成均匀分布的随机数。
接下来我们要求的是\(10^{12}\)个小于等于\(10^9\)的随机数完全覆盖\(0\)到\(10^9\)之间所有数的概率是多少。首先一个数被覆盖的概率是\(1-(1-\frac{1}{10^9})^{10^{12}} \approx 1-\mathrm{e}^{-10^3}\),我们可以近似地认为所有数都被覆盖的概率是\((1-\mathrm{e}^{-10^3})^{10^9}\),实际上这个数是非常接近\(1\)的(因为\(e^{10^3}\)比\(10^9\)大到哪里去都不知道了)
打不过打不过。
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
#define MOD 998244353
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
struct Graph
{
int g[15][15],a[15][15],T,edge;
void Calc()
{
T=1;
for(int i=2;i<=12;++i)
{
for(int j=i+1;j<=12;++j)
while(a[j][i])
{
int t=a[i][i]/a[j][i];
for(int k=i;k<=12;++k)a[i][k]=(a[i][k]+MOD-1ll*a[j][k]*t%MOD)%MOD;
for(int k=i;k<=12;++k)swap(a[i][k],a[j][k]);
T=MOD-T;
}
}
for(int i=2;i<=12;++i)T=1ll*T*a[i][i]%MOD;T=(T+MOD)%MOD;
}
void Add(int u,int v){++edge;g[u][v]=g[v][u]=1;a[u][v]--;a[v][u]--;a[u][u]++;a[v][v]++;}
void Rand()
{
for(int i=2;i<=12;++i)Add(rand()%(i-1)+1,i);
for(int i=1;i<=12;++i)
for(int j=i+1;j<=12;++j)
if(!g[i][j]&&rand()%10<8)
Add(i,j);
Calc();
}
void Output(int N)
{
for(int i=1;i<=12;++i)
for(int j=i+1;j<=12;++j)
if(g[i][j])printf("%d %d\n",N+i,N+j);
}
}G[1010];
pair<int,int> a[1010101];
int S[1010101],tot;
map<int,pair<int,int> >M;
void Output(int a,int b,int c,int d)
{
printf("48 %d\n",G[a].edge+G[b].edge+G[c].edge+G[d].edge+3);
G[a].Output(0);G[b].Output(12);G[c].Output(24);G[d].Output(36);
printf("1 13\n13 25\n25 37\n");
}
int main()
{
for(int i=1;i<=1000;++i)G[i].Rand();
for(int i=1;i<=1000;++i)
for(int j=i;j<=1000;++j)
++tot,M[S[tot]=1ll*G[i].T*G[j].T%MOD]=a[tot]=make_pair(i,j);
int T=read();
while(T--)
{
int K=read();if(!K){puts("2 0");continue;}
for(int i=1;i<=tot;++i)
{
int v=1ll*K*fpow(S[i],MOD-2)%MOD;
if(M.find(v)!=M.end())
{
Output(a[i].first,a[i].second,M[v].first,M[v].second);
break;
}
}
}
return 0;
}
【UOJ#75】【UR #6】智商锁(矩阵树定理,随机)的更多相关文章
- UOJ 75 - 【UR #6】智商锁(矩阵树定理+随机+meet-in-the-middle)
题面传送门 一道很神的矩阵树定理+乱搞的题 %%%%%%%%%%%%%%% vfk yyds u1s1 这种题目我是根本想不出来/kk,大概也就 jgh 这样的随机化带师才能想到出来吧 首先看到生成树 ...
- 矩阵树定理&BEST定理学习笔记
终于学到这个了,本来准备省选前学来着的? 前置知识:矩阵行列式 矩阵树定理 矩阵树定理说的大概就是这样一件事:对于一张无向图 \(G\),我们记 \(D\) 为其度数矩阵,满足 \(D_{i,i}=\ ...
- [spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)
In some countries building highways takes a lot of time... Maybe that's because there are many possi ...
- BZOJ 4766: 文艺计算姬 [矩阵树定理 快速乘]
传送门 题意: 给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图$K_{n,m}$ 求生成树个数 1 <= n,m,p <= 10^18 显然不能暴力上矩阵树定理 看 ...
- bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 559 Solved: 325[Submit][Sta ...
- 【LOJ#6072】苹果树(矩阵树定理,折半搜索,容斥)
[LOJ#6072]苹果树(矩阵树定理,折半搜索,容斥) 题面 LOJ 题解 emmmm,这题似乎猫讲过一次... 显然先\(meet-in-the-middle\)搜索一下对于每个有用的苹果数量,满 ...
- 2019.01.02 bzoj2467: [中山市选2010]生成树(矩阵树定理)
传送门 矩阵树定理模板题. 题意简述:自己看题面吧太简单懒得写了 直接构建出这4n4n4n个点然后按照题面连边之后跑矩阵树即可. 代码: #include<bits/stdc++.h> # ...
- [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
题意 给你 \(n\) 个点的无向完全图,指定一棵树 \(S\),问有多少棵生成树和这棵树的公共边数量为 \(k\in[0,n-1]\) \(n\leq 100\) 分析 考虑矩阵树定理,把对应的树边 ...
- 【bzoj4596】[Shoi2016]黑暗前的幻想乡 容斥原理+矩阵树定理
题目描述 给出 $n$ 个点和 $n-1$ 种颜色,每种颜色有若干条边.求这张图多少棵每种颜色的边都出现过的生成树,答案对 $10^9+7$ 取模. 输入 第一行包含一个正整数 N(N<=17) ...
随机推荐
- Scala,Java,Python 3种语言编写Spark WordCount示例
首先,我先定义一个文件,hello.txt,里面的内容如下: hello sparkhello hadoophello flinkhello storm Scala方式 scala版本是2.11.8. ...
- python爬取昵称并保存为csv
代码: import sys import io import re sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') ...
- 动态类型dynamic转换为特定类型T的方案
需求场景:有时候我们抓到一段请求数据,JSON格式的字符串数据,需要放在接口里重现问题,我们就可能会用dynamic先接受数据,然后再转换成特定数据发出请求. 方案一:直接使用特定对象T,来接受请求数 ...
- Flask笔记:信号机制
Flask中有内置的一些信号,也可以通过三方库blinker自定义信号,其实Flask内置的信号也是优先使用的blinker库,如果没有安装blinker才会使用自定义的信号机制.可以通过点击任意导入 ...
- JavaWeb之(1)Tomcat安装及项目的发布方法
Tomcat安装及项目的发布方法 Tomcat安装 1.直接解压,然后找到bin/startup.bat 2.双击,如果出现命令行界面且最后一句为"信息: Server startup in ...
- 安卓开发笔记(三十二):banner轮播图的实现
一.activity.xml 我这里主要爬取的爱奇艺首页的图片进行轮播,应用了两个github上的开源库,一个banner的库,一个加载网络图片的库,用开源库能够极大地节省我们编写代码的时间. < ...
- 一文解读5G (转)
今天要研究的对象,是5G接入网. 什么是接入网?相信不少同学,对这个概念一定不会陌生. 搬出这张移动通信架构图: 接入网,在我们无线通信里,一般指无线接入网,也就是通常所说的RAN(Radio Acc ...
- linux系统管理-输入输出
目录 linux系统管理-输入输出 参数传递xargs linux系统管理-输入输出 重定向 将原本要输出到屏幕上的数据信息,重新定向到指定的文件中 运行程序,或者输入一个命令:默认打开4个文件描述符 ...
- Python正则、re模块
正则的概念 findall match search 方法 元字符的用法和作用 正则表达式概念 正则表达式是对字符串操作的一种逻辑公式,就是对字符串的一种过滤 可以判断是 ...
- c# WF 第1节 创建winform程序
本节内容: 1:vs的RAD 2:WinForm的创建简介 3:创建窗口与控制台程序文件的对比 4:窗口文件内容 5:winform怎么运行 6:winform的实质 1:vs的RAD 2:WinFo ...