背景

自从芽衣、布洛妮娅相继灵魂觉醒之后,琪亚娜坐不住了。自己可是第一个入驻休伯利安号的啊!于是她打算去找德丽莎帮忙,为她安排了灵魂觉醒的相关课程。

第一天,第一节课。

“实现灵魂觉醒之前,你需要先将自己的崩坏能按顺序排好……”

“诶诶,这个要怎么做呢?”算法课没认真听讲也是没有办法的嘛。

于是,琪亚娜设(xia)计(bian)了一套自己的排序方法。

描述

我们可以用n张卡片代表崩坏能,上面恰好写了1到n。

一开始这些卡片是随机排列的,然后为了把它们从小到大排好序,进行如下操作:

①如果卡片已经按1到n排好序,结束操作。

②观察现有排列,如果某一个大于1的区间内的数是顺序加一的,就把这个区间内的卡片粘起来,它们在以后的操作中不会分开。(比如15234这个排列会把234粘起来)

③把所有卡片随机排列(粘在一起的不分开),然后回到①。

恰好路过的符华对这种排序方法非常感兴趣,希望知道它的期望复杂度。于是求期望进行③操作的次数的任务就交给你了。答案对1e9+7取模。

输入格式

一个不超过2000的整数n。

输出格式

一个整数,答案对1e9+7取模后的结果。

样例输入

3

样例输出

333333338

数据范围与约定

测试点 n
1 1
2 5
3 8
4 10
5 13
6 <=1000
7 <=1000
8 <=2000
9 <=2000
10 <=2000

样例解释

n=3时的精确值是

后记:

琪亚娜·卡斯兰娜:你们是怎么排序的啊?

雷电芽衣:有个库函数叫sort来着……

布洛妮娅:对,挺快的。

————————————————————————————

这题一开始我想着暴力 ans[x]=sigma g[x][y]*ans[y]

g[x][y]表示长度为x的排列 排一次之后缩成y段的概率

g[x][y]可以暴力算 不过后来打表发现是个组合数 然后就可以A辣

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
const int M=2e3+,mod=1e9+;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,k;
int g[M][M];
LL w[M],inv[M];
LL pmod(LL a,LL b){
int ans=;
while(b){
if(b&) ans=ans*a%mod;
b>>=; a=a*a%mod;
}
return ans;
}
void prepare(){
w[]=; for(int i=;i<=n;i++) w[i]=w[i-]*i%mod;
inv[n]=pmod(w[n],mod-);
for(int i=n;i;i--) inv[i-]=inv[i]*i%mod;
}
int f[M],v[M],s[M],ans[M];
void P(int &x){x=(x%mod+mod)%mod;}
int main(){
n=read(); prepare();
for(int j=;j<=n;j++){
g[j][j]=w[j]-s[j]; P(g[j][j]);
for(int i=j+;i<=n;i++){
g[i][j]=g[j][j]*(w[i-]*inv[j-]%mod*inv[i-j]%mod)%mod; P(g[i][j]);
s[i]+=g[i][j]; P(s[i]);
}
}
ans[]=;
for(int i=;i<=n;i++){
LL ly=;
for(int j=;j<i;j++) ly=(ly+1LL*g[i][j]*inv[i]%mod*(ans[j]+)%mod)%mod;
ans[i]=((ly+g[i][i]*inv[i]%mod)*pmod((-g[i][i]*inv[i]%mod+mod)%mod,mod-))%mod;
}printf("%d\n",ans[n]);
return ;
}

最新文章

  1. Azure的负载均衡机制
  2. Scalaz(58)- scalaz-stream: fs2-并行运算示范,fs2 parallel processing
  3. Android(Logcat、Monitors)
  4. 字符串哈希函数(String Hash Functions)
  5. HttpRequest.UserAgent 属性 (System.Web)
  6. 【leetcode❤python】 112. Path Sum
  7. 关于css中列表(ul ol)存在默认间距的问题
  8. C#整理3——运算符和语句
  9. ssh配置导致Ansible并发失败
  10. Java线程间通信之wait/notify
  11. require.js详解
  12. protobuf/android 交叉编译笔记
  13. 【解决问题】SSH连不上Ubuntu虚拟机解决办法
  14. Python进阶_类与实例
  15. Mac安装opencv指南
  16. hdu2955 Robberies(背包)
  17. Flume架构以及应用介绍
  18. 使用Vuex打开log功能
  19. 第26次Scrum会议(11/14)【欢迎来怼】
  20. eclipse软件与git配合使用创建git仓库

热门文章

  1. 【Linux】linux中删除指定文件外所有其他文件(夹)的问题
  2. 【Python】python学习之总结
  3. BZOJ 1452 Count(二维树状数组)
  4. BZOJ4860 Beijing2017树的难题(点分治+单调队列)
  5. BZOJ5190 Usaco2018 Jan Stamp Painting(动态规划)
  6. JS执行上下文(执行环境)详细图解
  7. 虚拟机如何进入BIOS
  8. POJ3648:Wedding——题解(配2-SAT简易讲解)
  9. 洛谷 P3527 [POI2011]MET-Meteors 解题报告
  10. HDOJ.1342 Lotto (DFS)