Solution - AGC060C
简要题意:称一个长为 \(2^n-1\) 的排列 \(P\) 像堆,如果 \(P_i \lt P_{2i}\),且 \(P_i \lt P_{2i+1}\)。给定 \(a,b\),设 \(u=2^a,v=2^{b+1}-1\),在所有像堆的排列中任取一个,求 \(P_u \lt P_v\) 的概率。
既然这个排列像堆,那就把这个问题放在满二叉树上解决。结点 \(i\) 的权值是 \(P_i\),子结点是 \(2i\) 和 \(2i+1\)。
首先,如果把结点编号,然后按照权值排列,那么就是对这棵满二叉树做了一次拓扑排序,这里父结点向子结点连有向边。那么,我们只需要考虑结点的一个排列 \(S\),使得 \(i\) 在其子树的前面。
题目中给定的 \(u,v\) 分别是第 \(a+1\) 层最左边的结点和第 \(b+1\) 层最右边的结点。而题目要求的 \(P_u \lt P_v\) 可以看作是从 \(u\) 向 \(v\) 连了一条有向边,或者说 \(S\) 中 \(u\) 必须在 \(v\) 前面。(下面的叙述中,涉及树的概念都是没有考虑这条边的)
这个拓扑序的开头当然是 \(1\),然后整个图被分成了两棵满二叉树,从一棵的某个点向另一棵的某个点连边。
接下来,当然是选择一棵树的根结点。然后,这棵树又被分成了两棵树,其中有一棵是不含 \(u,v\) 之一的。那么,在安排好剩下的两棵树之后,将这棵树随意插入已有的排列即可。
想到这里,一个 DP 的方式呼之欲出:设 \(dp_{i,j}\) 表示剩下一棵 \(i\) 层的满二叉树和一棵 \(j\) 层的满二叉树的方案数,则 \(dp_{i,j}\) 会从 \(dp_{i-1,j}\) 和 \(dp_{i,j-1}\) 转移而来。注意,由于 \(u,v\) 距离叶子层的深度是不变的,所以这样的状态定义已经足够。再用 \(f_{i,j}\) 表示相应的概率。
我们还需要考虑一个普通的 \(i\) 层满二叉树的拓扑序总数。设为 \(S_i\)。
先求 \(S_i\) 的递推式。第一步是选择根结点,然后是将两棵子树的所有排列方式放入拓扑序中。所有排列有 \(S_{i-1}^2\) 种。每棵子树的拓扑序长度为 \(2^{i-1}-1\),所以插入的方式有 \(C_{2^i-2}^{2^{i-1}-1}\) 种。于是
\]
设 \(u,v\) 分别在倒数第 \(A,B\) 层,则 DP 的初始值为 \(f_{A-1,j}=1\) 对 \(j \ge B\) 成立。
与前面类似可得 \(dp_{i,j}\) 的递推式为:
\]
又由于
\]
所以
\]
\]
\]
结合
\]
\]
\]
\]
最后我们得到了一个漂亮的表达式:
\]
答案是 \(f_{n-1,n-1}\)。
Code:
#include<bits/stdc++.h>
using namespace std;
const int N=5005,mod=998244353;
int n,A,B;
long long pwr2[N],p[N][N],f[N][N];
int power(int a,int b){
int c=1;
for(;b;b>>=1){
if(b&1)c=1ll*c*a%mod;
a=1ll*a*a%mod;
}
return c;
}
int main(){
scanf("%d%d%d",&n,&A,&B);
A=n-A;B=n-B;
for(int i=1;i<=n;i++)pwr2[i]=power(2,i);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
p[i][j]=(pwr2[i]-1)*power(pwr2[i]+pwr2[j]-2,mod-2)%mod;
for(int i=B;i<=n;i++)f[A-1][i]=1;
for(int i=A;i<=n;i++)
for(int j=B;j<=n;j++)
f[i][j]=(f[i-1][j]*p[i][j]%mod+f[i][j-1]*p[j][i]%mod)%mod;
printf("%d\n",f[n-1][n-1]);
return 0;
}
Solution - AGC060C的更多相关文章
- Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms
行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...
- Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架
Enterprise Solution 是一套管理软件开发框架,在这个框架基础上开发出一套企业资源计划系统Enterprise Edition. 现将Enterprise Solution开发过程中遇 ...
- Windows 10 部署Enterprise Solution 5.5
Windows 10正式版发布以后,新操作系统带来了许多的变化.现在新购买的电脑安装的系统应该是Windows 10.与当初用户不习惯Windows 7,购买新电脑后第一个想做的事情就是重装成XP,估 ...
- Enterprise Solution 企业资源计划管理软件 C/S架构,支持64位系统,企业全面应用集成,制造业信息化
Enterprise Solution是一套完整的企业资源计划系统,功能符合众多制造业客户要求.系统以.NET Framework技术作为开发架构,完善的功能可有效地帮助企业进行运营策划,减低成本,如 ...
- Dynamics CRM 2015-超大Solution导入问题
我们在将比较大的solution导入CRM的时候,经常会遇到超时的问题,这是因为CRM的本身的优化限制导致的,那么如何解决呢? 官方已经有了解决方案了. 在浏览完两种解决方法之后,我们要知道的是: 1 ...
- WATERHAMMER: A COMPLEX PHENOMENON WITH A SIMPLE SOLUTION
开启阅读模式 WATERHAMMER A COMPLEX PHENOMENON WITH A SIMPLE SOLUTION Waterhammer is an impact load that is ...
- Codility NumberSolitaire Solution
1.题目: A game for one player is played on a board consisting of N consecutive squares, numbered from ...
- codility flags solution
How to solve this HARD issue 1. Problem: A non-empty zero-indexed array A consisting of N integers i ...
- The Solution of UESTC 2016 Summer Training #1 Div.2 Problem C
Link http://acm.hust.edu.cn/vjudge/contest/121539#problem/C Description standard input/output After ...
- The Solution of UESTC 2016 Summer Training #1 Div.2 Problem B
Link http://acm.hust.edu.cn/vjudge/contest/121539#problem/B Description standard input/output Althou ...
随机推荐
- C# 证件照替换底色、设置背景图
软件说明 基于以下开源项目,做了再次封装 PaddleSegSharp: 本项目是一个基于百度飞桨PaddleSeg项目的人像分割模块而开发的.NET的工具类库.PaddleSeg是基于飞桨Paddl ...
- Java内存马2-Spring内存马
Spring内存马 目录 Spring内存马 1.Spring&Spring MVC简介 2.环境搭建 3.Controller内存马 4.踩坑日记 5.Interceptor内存马 1.Sp ...
- 感悟:FPGA的并行处理与PC的多线程处理
前言 FPGA的并行设计是其高速处理的核心之一, 通过并行地处理大量的数据实现预期的功能; PC的多线程设计则是处理大量的内容而衍生出的一种处理方式, 其本质是利用CPU的高速处理能力, 将单个线程以 ...
- 英语文档阅读学习系列之ZYNQ-7000 All Programmable SOC Packaging and Pinout
UG865-Zynq-7000-pkg-pinout 1.Table 一个overview和其他部分的构成一个整体. 2.overview This section describes the pin ...
- Lab1:Xv6 and Unix utilities
Sleep功能 通过接受时间参数,调用system_call 指令 sleep实现该功能 #include "kernel/types.h" #include "kern ...
- AndroidStudio--app是如何运行的
#实用快捷键# Ctrl+alt+F 快速自动把类方法内部的变量声明为类属性变量,以方便全局使用! Ctrl+O 快速显示所有类方法以及field属性结构 今天发现了一个非常好的博主----litt ...
- Windows11右键菜单设置成Win10旧版模式
Windows按键+X,打开终端(cmd),复制命令 reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c ...
- 论文阅读:A new approach solve the multi-product multi-period inventory lot sizing with supplier selection problem
论文:A new approach solve the multi-product multi-period inventory lot sizing with supplier selection ...
- #斜率优化,二分#CF631E Product Sum
题目 有一个数列 \(a\),其权值为 \(\sum_{i=1}^ni*a_i\), 现在可以任意选择其中一个数字扔到任意位置,使权值和最大. \(n\leq 2*10^5,|a_i|\leq 10^ ...
- #K-D Tree#洛谷 2093 [国家集训队]JZPFAR
题目 平面上有 \(n\) 个点.现在有 \(m\) 次询问,每次给定一个点 \((px, py)\) 和一个整数 \(k\), 输出 \(n\) 个点中离 \((px, py)\) 的距离第 \(k ...