Title
Solution
开头的
i
i
i必定是一定最先报高考成绩的学校,我们需要保证两个
i
i
i之间不重复出现其它学校。
∑
i
=
0
n
−
1
n
(
2
n
−
2
−
i
)
!
P
(
n
−
1
,
i
)
2
n
−
i
−
1
\sum_{i=0}^{n-1}\frac{n(2n-2-i)!P(n-1,i)}{2^{n-i-1}}
i=0∑n−12n−i−1n(2n−2−i)!P(n−1,i)
=
n
!
∗
∑
i
=
0
n
−
1
(
2
n
−
2
−
i
)
!
2
(
n
−
i
−
1
)
∗
(
n
−
i
−
1
)
!
=n!*\sum_{i=0}^{n-1}\frac{(2n-2-i)!}{2^{(n-i-1)}*(n-i-1)!}
=n!∗i=0∑n−12(n−i−1)∗(n−i−1)!(2n−2−i)!
注意要取模
可以线性求逆元,然后阶乘和
2
\mathbf{2}
2的求逆元下的次幂也可以
O
(
n
)
O(n)
O(n)推出。
Code
#include<cstdio>
#include<algorithm>
#define ll long long
#define mod 998244353
#define rep(i,x,y) for(register ll i=x;i<=y;i++)
#define fu_mod(x,y) (x+y<0?((x+y)%mod+mod)%mod:(x+y)%mod)
using namespace std;
const ll N=2000005;
ll n,f[N],t[N],jie[N],ff[N],ans;
int main(){
scanf("%lld",&n);
f[1]=t[0]=jie[1]=ff[0]=ff[1]=1;
rep(i,2,n) f[i]=(mod-mod/i)*f[mod%i]%mod;
rep(i,1,n) t[i]=t[i-1]*f[2]%mod;
rep(i,2,n*2) jie[i]=jie[i-1]*i%mod;
rep(i,2,n) ff[i]=ff[i-1]*f[i]%mod;
rep(i,0,n-1) ans=fu_mod(ans,jie[2*n-2-i]%mod*t[n-i-1]%mod*ff[n-i-1]%mod);
return 0&printf("%lld",ans*jie[n]%mod);
}