【CF1436C】Binary Search 题解
题意简介
要求有多少种 n 的排列,能够通过二分法正确地找到放在 pos 处的数字 x。
答案对 1e9+7 取模。n<=1000。
采用的二分法如下图:
思路分析
首先,这个排列中有一个位置是固定的,就是 a[pos] = x 。
我们知道,二分查找的过程是不断缩小区间的过程,想要找到一个已经确定放在 pos 位置上的 x ,需要判断的 mid 的位置,需要的大于 x 的数的个数 c1 和小于 x 的数的个数 c0 也是固定的。
也就是说,我们只需要模拟这个二分过程,求解出 c0 和 c1,然后利用排列组合的公式去计算就行了。
\(Ans = A^{c0}_{x-1} \times A^{c1}_{n-x} \times (n-1-c0-c1)!\)
由于本题的 n 的范围较小,可以不写逆元,直接暴力求阶乘。
顺带一提,本题有一个坑点在于不一定有解。显然的,当小于 x 的数不够 c0 个或大于 x 的数不够 c1 个时无解。
代码库
#include <cstdio>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,a,b) for(int i=a;i>=b;i--)
typedef long long ll;
const int MOD=1e9+7,N=1002;
inline ll _pow(ll x,ll p){
ll ans=1;
while(p){
if(p&1) ans=ans*x%MOD;
p>>=1; x=x*x%MOD;
}
return ans;
}
int n,x,pos,c0,c1;
ll fact[N];
int main(){
scanf("%d%d%d",&n,&x,&pos);
int l=0,r=n,mid;
while(l<r){
mid=(l+r)>>1;
if(mid<pos) c0++,l=mid+1;
else if(mid==pos) l=mid+1;
else c1++,r=mid;
}
fact[0]=1;
rep(i,1,n) fact[i]=(fact[i-1]*i)%MOD;
if(x-1-c0<0||n-x-c1<0||n-1-c0-c1<0) printf("0\n");
else printf("%lld\n",fact[x-1]*_pow(fact[x-1-c0],MOD-2)%MOD*fact[n-x]%MOD*_pow(fact[n-x-c1],MOD-2)%MOD*fact[n-1-c0-c1]%MOD);
return 0;
}
END
【CF1436C】Binary Search 题解的更多相关文章
- LeetCode编程训练 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- 算法与数据结构基础 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- [LeetCode]题解(python):098 Validate Binary Search Tree
题目来源 https://leetcode.com/problems/validate-binary-search-tree/ Given a binary tree, determine if it ...
- 【题解】【BST】【Leetcode】Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- 【题解】【BST】【Leetcode】Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- LintCode题解之Search Range in Binary Search Tree
1.题目描述 2.问题分析 首先将二叉查找树使用中序遍历的方式将元素放入一个vector,然后在vector 中截取符合条件的数字. 3.代码 /** * Definition of TreeNode ...
- [LeetCode 题解]: Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- LeetCode96_Unique Binary Search Trees(求1到n这些节点能够组成多少种不同的二叉查找树) Java题解
题目: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For e ...
- LeetCode Verify Preorder Sequence in Binary Search Tree
原题链接在这里:https://leetcode.com/problems/verify-preorder-sequence-in-binary-search-tree/ 题目: Given an a ...
随机推荐
- 疑难杂症 | Excel VBA锁定指定单元格区域
背景:锁定EXCEL表头 一.手动操作流程 其基本逻辑并不赋值,手动操作流程是: 1.取消所有单元格的"锁定"格式 CTRL+A,选中全部的单元格→单击右键→设置单元格格式→保护→ ...
- ThreadLocal源码分析与实践
ThreadLocal是什么? ThreadLocal是一个线程内部存储类,提供线程内部存储功能,在一个ThreadLocal对象中,每一个线程都存储各自独立的数据,互不干扰 示例如下: public ...
- .netcore 3.1 C# 微信小程序发送订阅消息
一.appsettings.json定义小程序配置信息 "WX": { "AppId": "wx88822730803edd44", &qu ...
- 关于window服务器中新建的普通用户无法登录远程桌面
今天在公司服务器中为客户创建了一个普通用户 user5201351 并设置好了密码, 发给客户后,反映使用我们创建的用户不能通过远程桌面进行登录 查询资料后才知道,在windows中,需要将用户加入 ...
- jfinal3连接sqlserver2012 保存日期字段出现“不支持从 UNKNOWN 到 UNKNOWN 的转换”错误
修改Dialect中的fillStatement方法,增加判断日期类型并转换为时间戳
- http走私攻击
http走私攻击 前端服务器和后端服务器接收数据不同步,引起对客户端传入的数据理解不一致,从而导致漏洞. 因为当服务器同时在处理Content-Length和Transfer-Encoding,Con ...
- Tengine更新安装
Tengine安装及配置 一,下载 http://tengine.taobao.org/download.html 找到下载包并且下载(Tengine-2.3.2.tar.gz) wget -c ht ...
- Python-鸡兔同笼问题
鸡兔同笼问题 -- 今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何? --鸡和兔在一个笼子里,从上面数,有35个头:从下面数,有94只脚.问笼中各有几只鸡和兔 如何逻辑整理? -- 鸡头和兔子 ...
- How to read h5 file by Matlab
In matlab, one can use the following command to read h5 file data = h5read(filename,ds) data = h5rea ...
- mysql-13-auto_increment
# 标识列 /* 自增长列 可以不用手动的插入值,系统提供默认的序列值 1.标识列必须和 key 搭配使用,比如主键.唯一键.外键 2.一个表至多一个标识列 3.标识列的类型只能是数值型 4.标识列可 ...