题意简述
对于一个排列 ${p= \{ 1,2,...,n\}}p={1,2,...,n}$,记 $\text{val}(p)$ 等于最小的 $i$ 满足 ${i}> a_ii>a$ ,如不存在则 $\text{val}(p)=n+1$ 。求 $\text{val}(p)$ 的期望值,答案对 $998244353$ 取模。
题解
令 $k=n+1-i$ ,枚举 $a_i=j$ ,则前 $i-1$ 个数的可行的方案为:
$sum_i=$ $\sum \limits_{j=1}^{i-1}(k+1)^{i-1-j} \times k^j$
大力观察发现是等比数列。
等比数列求和公式:
$\sum \limits _{k=0}^{n-1}(x \times a^{k}) = x \times (\frac{a^{n}-1}{a-1})$
所以带入化简得到:
$sum_i= $ $(k+1)^{n-k} \times (\frac{(\frac{k}{k+1})^{n-k}-1}{(\frac{k}{k+1}-1)})\times \frac{k}{k+1}$
$= (k+1)^{n-k} \times(1-(\frac{k}{k+1})^{n-k}) \times k$
$= k\times((k+1)^{n-k}-k^{n-k}) $
因为枚举 $i$ 和枚举 $k$ 本质上都是一样的。
故答案为:
$ans = \sum \limits_{k=0}^{n-1}sum_k \times i \times (k-1)!$
$= \sum \limits_{k=0}^{n-1} (n+1-k) \times k\times((k+1)^{n-k}-k^{n-k}) \times (k-1)!$
$= \sum \limits_{k=0}^{n-1} (n+1-k) \times k! \times((k+1)^{n-k}-k^{n-k})$
然后就可以 $\mathcal{O}(n\log{n})$ 搞过去了。
Code
#include <bits/stdc++.h>
#define int long long
#define N 1000005
using namespace std;
inline int read() {
int x=0, w=1;
char ch=getchar();
while (ch>'9'||ch<'0') {if(ch=='-') w=-1;ch=getchar();}
while (ch >='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x * w;
}
const int mod=998244353;
int n,ans;
int jc[N];
int ksm(int x,int k){
int sum=1;
while(k){
if(k&1) sum=sum*x%mod;
x=x*x%mod;k>>=1;
}
return sum;
}
signed main(){
n=read();
jc[0]=1;for(int i=1;i<=n;++i) jc[i]=jc[i-1]*i%mod;
for(int k=0;k<=n;++k){
ans+=(n-k+1)*jc[k]%mod*(ksm(k+1,n-k)-ksm(k,n-k)+mod)%mod;
ans%=mod;
}
printf("%lld",ans*ksm(jc[n],mod-2)%mod);
return 0;
}
Add :
还可以OEIS大力观察得出结论