不妨假设$x\le y$,可以通过翻转整个格子序列来调整

令$a_{i}$​​为$i$​​到$y$​​的期望步数,显然有方程$a_{i}=\begin{cases}0&(i=y)\\\frac{\sum_{j=i+1}^{n}a_{j}}{n-i}+1&(i<y)\\\frac{\sum_{j=1}^{i-1}a_{j}}{i-1}+1&(i>y)\end{cases}$​​​

将其写成递推的形式,即
$$
\forall 1\le i\le y-2,a_{i}=\frac{n-i-1}{n-i}(a_{i+1}-1)+\frac{1}{n-i}a_{i+1}+1=a_{i+1}+\frac{1}{n-i}
$$
进一步的,即有$a_{i}=a_{y-1}+\sum_{j=i}^{y-2}\frac{1}{n-j}$​​,代入$a_{y+1}$的式子即
$$
a_{y+1}=\frac{\sum_{i=1}^{y}a_{i}}{y}+1=\frac{a_{y-1}+\sum_{i=1}^{y-2}(a_{y-1}+\sum_{j=i}^{y-2}\frac{1}{n-j})}{y}+1=k_{1}a_{y-1}+C_{1}
$$
(其中$k_{1}=\frac{y-1}{y},C_{1}=\frac{\sum_{i=1}^{y-2}\sum_{j=i}^{y-2}\frac{1}{n-j}}{y}+1$​​​,显然为常数,且不难​​预处理得到)

类似地,也可以得到$a_{y-1}=\frac{n-y}{n-y+1}a_{y+1}+\frac{\sum_{i=y+2}^{n}\sum_{j=y+2}^{i}\frac{1}{j-1}}{n-y+1}+1$​​(同样记为$a_{y-1}=k_{2}a_{y+1}+C_{2}$​)​​

将前者代入后者,即$a_{y-1}=k_{2}(k_{1}a_{y-1}+C_{1})+C_{2}$​​​​​​,解得$a_{y-1}=\frac{k_{2}C_{1}+C_{2}}{1-k_{1}k_{2}}$​​,将$k_{1}$​​和$k_{2}$​​的式子代入,不难得到$1-k_{1}k_{2}=\frac{n}{y(n-y+1)}$​​​

再根据前面,也即有答案$a_{x}=\frac{y(n-y+1)(k_{2}C_{1}+C_{2})}{n}+\sum_{i=x}^{y-2}\frac{1}{n-i}$(注意特判$x=y$和$y=n$)

综上,$o(n)$​​​​​预处理后即可$o(1)$​​​​​计算,时间复杂度为$o(n+T)$​​​​​

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2000005
4 #define mod 1000000007
5 #define ll long long
6 int t,n,x,y,ans,inv[N],S1[N],S2[N];
7 int main(){
8 inv[0]=inv[1]=S1[0]=S2[0]=1;
9 for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
10 for(int i=1;i<N;i++)S1[i]=(S1[i-1]+inv[i])%mod;
11 for(int i=1;i<N;i++)S2[i]=(S2[i-1]+S1[i])%mod;
12 scanf("%d",&t);
13 while (t--){
14 scanf("%d%d%d",&n,&x,&y);
15 if (x>y)x=n-x+1,y=n-y+1;
16 if (x==y){
17 printf("0\n");
18 continue;
19 }
20 if (y==n){
21 printf("%d\n",(1+S1[n-x]-S1[n-y+1]+mod)%mod);
22 continue;
23 }
24 int k1=(ll)(y-1)*inv[y]%mod,k2=(ll)(n-y)*inv[n-y+1]%mod;
25 int C1=((S2[n-1]-S2[n-y+1]+mod)%mod-(ll)(y-2)*S1[n-y+1]%mod+mod)%mod;
26 int C2=((S2[n-1]-S2[y]+mod)%mod-(ll)(n-y-1)*S1[y]%mod+mod)%mod;
27 C1=((ll)C1*inv[y]+1)%mod,C2=((ll)C2*inv[n-y+1]+1)%mod;
28 ans=(ll)y*(n-y+1)%mod*(((ll)k2*C1+C2)%mod)%mod*inv[n]%mod;
29 ans=(ans+(S1[n-x]-S1[n-y+1]+mod)%mod)%mod;
30 printf("%d\n",ans);
31 }
32 return 0;
33 }

[hdu7000]二分的更多相关文章

  1. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  2. BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3352  Solved: 919[Submit][Stat ...

  3. 整体二分QAQ

    POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...

  4. [bzoj2653][middle] (二分 + 主席树)

    Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...

  5. [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二

    Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...

  6. [LeetCode] Closest Binary Search Tree Value 最近的二分搜索树的值

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  7. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  8. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

    1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...

  9. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

随机推荐

  1. iOS Swift逻辑运算符

    运算符 运算符分类 从操作数角度看:运算符包括一元.二元.三元.这里的一二三指操作数的数量,操作数指的是被操作的数值. 从运算符位置看:运算符分为前缀.中缀.后缀.例如:!b, b + c, c! 赋 ...

  2. 牛逼的磁盘检查工具duf

    1.部署 wget https://github.com/muesli/duf/releases/download/v0.5.0/checksums.txt wget https://github.c ...

  3. C++核心编程 4 类和对象-封装

    C++面向对象的三大特性:封装.继承.多态 C++认为万事万物皆为对象,对象上有其属性和行为 封装 意义:1.将属性和行为作为一个整体,表现生活中的事物 语法: class 类名{   访问权限:属性 ...

  4. 《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)

    1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,于是写了这一篇文章,另外也是 ...

  5. GoLang设计模式11 - 备忘录模式

    备忘录模式是一种行为型设计模式.这种模式允许我们保存对象在某些关键节点时的必要信息,以便于在适当的时候可以将之恢复到之前的状态.通常它可以用来帮助设计撤销/恢复操作. 下面是备忘录设计模式的主要角色: ...

  6. 【UE4 设计模式】工厂方法模式 Factory Method Pattern 及自定义创建资源

    概述 描述 又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式,或者多态工厂(Polymorphic Factory)模式 工厂父类负责定义创建产品对象的公共接口,而工厂子类 ...

  7. Java字符串转数字和数字转字符串

    int转String有3种方式 (1)num + "" (2)String.valueOf(num) (3)Integer.toString(num) String转int有2种方 ...

  8. 从浏览器发送请求给SpringBoot后端时,是如何准确找到哪个接口的?(下篇)

    纸上得来终觉浅,绝知此事要躬行 注意: 本文 SpringBoot 版本为 2.5.2; JDK 版本 为 jdk 11. 前言: 前文:你了解SpringBoot启动时API相关信息是用什么数据结构 ...

  9. 计算机网络:HTTP

    计算机网络基础:HTTP 先验知识 HTTP和其他协议的关系 通过下图,了解IP协议,TCP协议,DNS服务在使用HTTP协议通信过程中各自发挥的作用: 服务器处理流程 接受客户端连接 ------& ...

  10. 大牛针对零基础入门c语言详解指针(超详细)

    C语言指针说难不难但是说容易又是最容易出错的地方,因此不管是你要做什么只要用到C指针你就跳不过,今天咱们就以 十九个例子来给大家简单的分析一下指针的应用,最后会有C语言视频资料提供给大家更加深入的参考 ...