首先这个题要分析不少东西:
- B数组是取0~1内的实数 任意两个元素相等的概率为0 所以我们可以认为 B数组的每个元素都不相等 可以看作全排列
- 对于合法序列B 其元素的期望值为1/2 (0~1上的均匀分布) 所以序列的期望值为 n/2
- A和B满足题目条件 当且仅当 A和B的笛卡尔树同构 而全排列总共有 种 其中满足同构的有 所以同构的概率为
- 综上所述 最终的答案为
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef long long ll;
ll mod = 1e9+7;
ll inv[N],ans;
int a[N],ls[N],rs[N];
stack<int>s;
int dfs(int rt){
int tot=1;
if(!ls[rt]&&!rs[rt]) return 1;
if(ls[rt]) tot+=dfs(ls[rt]);
if(rs[rt]) tot+=dfs(rs[rt]);
ans=(ans*inv[tot])%mod;
return tot;
}
int main(){
inv[1]=1;
for(int i = 2; i <= 1e6; i++)
inv[i]=inv[mod%i]*(mod-mod/i)%mod;
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++) scanf("%d",&a[i]),ls[i]=rs[i]=0;
for(int i = 1; i <= n; i++){
while(!s.empty()&&a[i]>a[s.top()]) ls[i]=s.top(),s.pop();
if(!s.empty()) rs[s.top()]=i;
s.push(i);
}
ans=1ll*n*inv[2]%mod;
int rt;
while(!s.empty()) rt=s.top(),s.pop();
dfs(rt);
printf("%lld\n",ans);
}
return 0;
}