Description

有\(1...n\)一共\(n\)个数。保证\(n\)为偶数。

小M要把这\(n\)个数两两配对, 一共配成\(n/2\)对。每一对的权值是他们两个数的和。

小M想要知道这\(n\)对里最大的权值的期望是多少。可怜的小M当然不知道啦,所以她向你求助。

请输出答案对\(10^9+7\)取模的值。

  

Input

一行一个正整数,表示\(n\)。

  

Output

一行一个整数,表示答案对\(10^9+7\)取模的值。

  

Sample Input

4

  

Sample Output

6

  

HINT

对于20%的数据, \(n\leq 10\)。

对于40%的数据, \(n\leq 2*10^3\)。

对于100%的数据, \(n\leq 5*10^5\)。

  

    

    

  

Solution

  

​  首先可能的最大值最大为\(n+(n-1)=2n-1\)

  

​  考虑能不能枚举最大值\(v\),算出最大值等于每个\(v\)时的方案数,除以总方案数得到概率,再算出期望。

  

​  观察得出\(v\in [n+1,2n-1]\),所以只要在这个区间内枚举即可。

  

​  可是考虑到计算最大值恰好等于\(v\)的方案数不是很可行,于是我们看看能不能转化成先求前缀和:\(g[i]\)表示最大值小于等于\(v\)的方案数是多少。自然地,最大值等于\(v\)时的方案数为\(g_v-g_{v-1}\)。

  

​  下面看怎么求\(g_v\),记\(a=\lfloor \frac v 2 \rfloor\):

  

​  首先这\(n\)个数中,有些比较特别:\((a,n]\)这些数,必须选择位于\([1,a]\)中的数,否则最大值可能超过\(v\)。那就先考虑这些数的匹配方法。

  

​  先看看\(n\)有多少种选法:\(n\)必须和\([1,v-n]\)中的数匹配,共\(v-n\)种选择。

 

​  \(n-1\)呢?必须和\([1,v-(n-1)]\)中的数匹配,共\(v-n+1\)种选择;但是\(n\)已经从\([1,v-n]\)挑走了一个数,所以总选择方案减1,仍然是\(v-n\)种选择。

   

​  由此从大到小考虑\((a,n]\),发现每个数的可选择方案都是\(v-n\),那么为\((x,n]\)共\(n-a\)个数选择好匹配的总方案数为\((v-n)^{n-a}\)。

  

​  此时\([1,a]\)个数中已有\(n-a\)个数被挑走做匹配了,剩下\(a-(n-a)=2a-n\)个数,由于它们都小于等于\(a\),所以剩下的数可以任意匹配而不会出现一对数权值之和大于\(v\)的情况。

  

​  记\(f(x)\)表示\(x\)个点任意两两匹配的方案数,推一推就得知\(f(x)=f(x-2)*(x-1)\),意思就是一个点从其他\(x-1\)个点挑一个,移除这两个点后继续操作。

  

​  则剩下的数的方案为\(f(2a-n)\)。

  

  所以\(g_v=(v-n)^{n-a}*f(2a-n)\)。

  

​  总方案数是多少?可以理解为\(g_{2n}\),也可以理解为\(f(n)\),总之就是完全没有限制时的方案数。

  

​  有了\(g\)数组,就可以算出对于最大值为\([n+1,2n-1]\)时的方案数,除以总方案数算出每个最大值出现的概率,最后就可以算出期望了。

    

  

#include <cstdio>
using namespace std;
const int mod=1e9+7;
const int N=500010;
int n,f[N*2],g[N*2];
inline int pow(int x,int y){
int res=1;
for(;y;x=1LL*x*x%mod,y>>=1)
if(y&1) res=1LL*res*x%mod;
return res;
}
int main(){
scanf("%d",&n);
f[0]=1;
for(int i=2;i<=n;i+=2) f[i]=1LL*f[i-2]*(i-1)%mod;
for(int v=n+1;v<=n*2;v++)
g[v]=1LL*pow(v-n,n-v/2)*f[v/2-(n-v/2)]%mod;
int ans=0;
for(int v=n+1;v<=n*2;v++)
(ans=ans+1LL*(g[v]-g[v-1])*v%mod)%=mod;
ans=1LL*ans*pow(g[n*2],mod-2)%mod;
printf("%d\n",ans<0?ans+mod:ans);
return 0;
}

Mythological VI的更多相关文章

  1. 【XSY2786】Mythological VI 数学

    题目描述 有\(1\sim n\)一共\(n\)个数.保证\(n\)为偶数. 你要把这\(2n\)个数两两配对,一共配成\(n\)对.每一对的权值是他们两个数的和. 你想要知道这\(n\)对里最大的权 ...

  2. 在docker容器中vi指令找不到

    在使用docker容器时,有时候里边没有安装vi,敲vi命令时提示说:vi: command not found,这个时候就需要安装vi,可是当你敲apt-get install vi命令时,提示: ...

  3. linux vi 命令大全

    进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...

  4. Cygwin中解决vi编辑器方向键和Backspace键不好使、安装vim的方法

    修改.virc文件(如果没有就创建)vi .virc 添加以下内容set nocpset backspace=start,indent,eol 保存退出:wq 如果是vim就修改.vimrc文件. 由 ...

  5. vi(vim)键盘图及其基本命令

    进入vi vi filename                打开或新建文件,并将光标置于第一行首 vi +n filename           打开文件,并将光标置于第 n行首 vi + fi ...

  6. vi安装Vundle+YouCompleteMe+注释快捷'scrooloose/nerdcommenter'

    Vundle is short for Vim bundle and is a Vim plugin manager. 从git上下载vundle $ git clone https://github ...

  7. vi学习总结

    1.模式 命令行模式:光标的移动.内容删除移动复制操作 插入模式:文字输入,即编辑状态 底行模式:文件保存或退出vi,设置编辑环境 2.基本操作 vi myfile,输入vi 文件名,,则进入vi. ...

  8. vim(vi)常用操作及记忆方法

    vi(vim)可以说是linux中用得最多的工具了,不管你配置服务也好,写脚本也好,总会用到它.但是,vim作为一个“纯字符”模式下的工具,它的操作和WINDOWS中的文本编辑工具相比多少有些复杂.这 ...

  9. vim vi Ubuntu

    在vi编辑模式下按退格键不能删除内容,按方向键不能上下左右移动?如果是则:1. 在vi里非编辑模式下按冒号进入到末行命令模式,然后输入set nocompatible,回车,然后在进入vi编辑模式,看 ...

随机推荐

  1. 从python容器中随机选取元素

    # 1.使用python random模块的choice方法随机选择某个元素 import random foo = ['a', 'b', 'c', 'd', 'e'] from random imp ...

  2. 《Pro SQL Server Internals, 2nd edition》的CHAPTER 1 Data Storage Internals中的Data Pages and Data Rows(翻译)

    数据页和数据行 数据库中的空间被划分为逻辑8KB的页面.这些页面是以0开始的连续编号,并且可以通过指定文件ID和页号来引用它们.页面编号都是连续的,这样当SQL Server增长数据库文件时,从文件中 ...

  3. Netty源码分析第5章(ByteBuf)---->第9节: ByteBuf回收

    Netty源码分析第五章: ByteBuf 第九节: ByteBuf回收 之前的章节我们提到过, 堆外内存是不受jvm垃圾回收机制控制的, 所以我们分配一块堆外内存进行ByteBuf操作时, 使用完毕 ...

  4. IDEA配置maven中央库

    分两步: STEP :配置maven: STEP :配置IDEA.区分默认配置和项目级配置. STEP 1:maven中央库配置 国内常用的maven库主要是阿里云maven库.华为云maven. 其 ...

  5. MySQL基础练习(三)

    经过之前两次的学习,这次用MySQL进行略微复杂的操作练习 各部门工资最高的员工 首先创建表employee和表department.如下 我们需要查询每个部门工资最高的员工 select a.Nam ...

  6. mybatis oracle和mysql like模糊查询写法

    oracle:RESOURCE_NAME LIKE '%' || #{resourceName} || '%'mysql:RESOURCE_NAME like concat(concat(" ...

  7. CS小分队第二阶段冲刺站立会议(6月4日)

    昨日成果:昨天一直在对主界面进行修改,遇到问题没有进展 遇到的问题:我代码写的不够缜密,各按钮信息添加的删除的时候总是有重名或者覆盖现象,需要有一次大的检查 今日计划:冲刺已经结束,项目的难度超过了预 ...

  8. 【贪心算法】POJ-3190 区间问题

    一.题目 Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one wil ...

  9. Hibernate 延迟加载 分析

    出处:http://www.ibm.com/developerworks/cn/java/j-lo-hibernatelazy/#icomments Hibernate 的延迟加载(lazy load ...

  10. 配置ssh免密码登入

    首先要设置好主机名hostnamectl,然后编辑文件/etc/hosts 192.168.43.9 node0 192.168.43.10 node1 192.168.43.11 node2     ...