Problem Statement
You are given a permutation P P P of ( 1 , 2 , … , N ) (1,2,\dots,N) (1,2,…,N) and an integer K K K.
Find the expected value, modulo 998244353 998244353 998244353, of the inversion number of P P P after performing the following operation:
- First, choose an integer i i i uniformly at random between 1 1 1 and N − K + 1 N - K + 1 N−K+1, inclusive.
- Then, shuffle P i , P i + 1 , … , P i + K − 1 P_i, P_{i+1}, \dots, P_{i+K-1} Pi,Pi+1,…,Pi+K−1 uniformly at random.
What is the inversion number?
- The inversion number of a sequence ( A 1 , A 2 , … , A N ) (A_1, A_2, \dots, A_N) (A1,A2,…,AN) is the number of integer pairs ( i , j ) (i, j) (i,j) satisfying 1 ≤ i < j ≤ N 1 \leq i < j \leq N 1≤i<j≤N and A i > A j A_i > A_j Ai>Aj.
What does “expected value modulo 998244353 998244353 998244353” mean?
- It can be proved that the sought expected value is always rational. Under the constraints of this problem, when this value is represented as an irreducible fraction P Q \frac{P}{Q} QP, it can also be proved that Q ≢ 0 ( m o d 998244353 ) Q \not\equiv 0 \pmod{998244353} Q≡0(mod998244353). Thus, there is a unique integer R R R satisfying R × Q ≡ P ( m o d 998244353 ) , 0 ≤ R < 998244353 R \times Q \equiv P \pmod{998244353}, \ 0 \le R < 998244353 R×Q≡P(mod998244353), 0≤R<998244353. Report this integer R R R.
中文题意
问题陈述
你得到一个 ( 1 , 2 , … , N ) (1,2,\dots,N) (1,2,…,N) 的排列 P P P 和一个整数 K K K 。
对 P P P 的反转数求模 998244353 998244353 998244353 的期望值:
—首先,在
1
1
1 到
N
−
K
+
1
N - K + 1
N−K+1 之间均匀随机选择一个整数
i
i
i 。
—然后,均匀随机洗牌
P
i
,
P
i
+
1
,
…
,
P
i
+
K
−
1
P_i, P_{i+1}, \dots, P_{i+K-1}
Pi,Pi+1,…,Pi+K−1 。
反转数是多少?
- 序列 ( A 1 , A 2 , … , A N ) (A_1, A_2, \dots, A_N) (A1,A2,…,AN) 的反转数是满足 1 ≤ i < j ≤ N 1 \leq i < j \le N 1≤i<j≤N 和 A i > A j A_i > A_j Ai>Aj 的整数对 ( i , j ) (i, j) (i,j) 的个数。
“期望值模 998244353 998244353 998244353 ”是什么意思?
- 可以证明所寻求的期望值总是理性的。在本问题的约束下,当该值表示为不可约分数 P Q \frac{P}{Q} QP 时,也可以证明 Q ≢ 0 ( m o d 998244353 ) Q \not\equiv 0 \pmod{998244353} Q≡0(mod998244353) 。因此,有一个唯一的整数 R R R 满足 R × Q ≡ P ( m o d 998244353 ) , 0 ≤ R < 998244353 R \times Q \equiv P \pmod{998244353}, \ 0 \le R < 998244353 R×Q≡P(mod998244353), 0≤R<998244353 。报告这个整数 R R R 。
Constraints
- All input values are integers.
- 1 ≤ K ≤ N ≤ 2 × 1 0 5 1 \le K \le N \le 2 \times 10^5 1≤K≤N≤2×105
- P P P is a permutation of ( 1 , 2 , … , N ) (1,2,\dots,N) (1,2,…,N).
Input
The input is given from Standard Input in the following format:
N
N
N
K
K
K
P
1
P_1
P1
P
2
P_2
P2
…
\dots
…
P
N
P_N
PN
Output
Print the answer in one line.
Sample Input 1
4 2
1 4 2 3
Sample Output 1
166374061
The operation changes the permutation P P P into the following:
- ( 1 , 4 , 2 , 3 ) (1,4,2,3) (1,4,2,3) … probability 1 / 2 1/2 1/2
- ( 4 , 1 , 2 , 3 ) (4,1,2,3) (4,1,2,3) … probability 1 / 6 1/6 1/6
- ( 1 , 2 , 4 , 3 ) (1,2,4,3) (1,2,4,3) … probability 1 / 6 1/6 1/6
- ( 1 , 4 , 3 , 2 ) (1,4,3,2) (1,4,3,2) … probability 1 / 6 1/6 1/6
The expected value of the inversion number is 2 × 1 2 + 3 × 1 6 + 1 × 1 6 + 3 × 1 6 = 13 6 \displaystyle 2 \times \frac{1}{2} + 3 \times \frac{1}{6} + 1 \times \frac{1}{6} + 3 \times \frac{1}{6} = \frac{13}{6} 2×21+3×61+1×61+3×61=613.
13 6 \displaystyle \frac{13}{6} 613 modulo 998244353 998244353 998244353 is 166374061 166374061 166374061, so print this number.
Sample Input 2
1 1
1
Sample Output 2
0
Sample Input 3
10 6
7 4 10 5 6 1 8 2 3 9
Sample Output 3
499122200
解法
当 P L , P L + 1 , … , P R P_L,P_{L+1},\dots,P_R PL,PL+1,…,PR 被洗牌时,反转数会发生怎样的变化?
- Block X X X … P 1 , P 2 , … , P L − 1 P_1,P_2,\dots,P_{L-1} P1,P2,…,PL−1
- Block Y Y Y … P L , P L + 1 , … , P R P_L,P_{L+1},\dots,P_R PL,PL+1,…,PR
- Block Z Z Z … P R + 1 , P R + 2 , … , P N P_{R+1},P_{R+2},\dots,P_N PR+1,PR+2,…,PN
考虑元素 P i P_i Pi 和 P j P_j Pj i < j i<j i<j 在洗牌后的相对位置。
- 如果 P i P_i Pi 属于 X X X 块, P j P_j Pj 属于 X X X 块,那么洗牌后 P i P_i Pi 仍然比 P j P_j Pj 早。
- 如果 P i P_i Pi 属于 X X X 块, P j P_j Pj 属于 Y Y Y 块,那么洗牌后 P i P_i Pi 仍然比 P j P_j Pj 早。
- 如果 P i P_i Pi 属于 X X X 块, P j P_j Pj 属于 Z Z Z 块,那么洗牌后 P i P_i Pi 仍然比 P j P_j Pj 早。
- 如果 P i P_i Pi 属于 Y Y Y 块, P j P_j Pj 属于 Y Y Y 块……洗牌后, P i P_i Pi 以 1 / 2 1/2 1/2 的概率早于 P j P_j Pj , P j P_j Pj 以 1 / 2 1/2 1/2 的概率早于 P i P_i Pi 。
- 如果 P i P_i Pi 属于 Y Y Y 块, P j P_j Pj 属于 Z Z Z 块,那么洗牌后 P i P_i Pi 仍然比 P j P_j Pj 早。
- 如果 P i P_i Pi 属于 Z Z Z 块, P j P_j Pj 属于 Z Z Z 块,那么洗牌后 P i P_i Pi 仍然比 P j P_j Pj 早。
因此,两个元素的相对位置保持不变,除非它们都在块Y中,而块Y被随机均匀地洗牌。
通过讨论可知,期望的反演数为(原
P
P
P 的反演数)
−
-
− (原
P
L
,
P
L
+
1
,
…
,
P
R
P_L,P_{L+1},\dots,P_R
PL,PL+1,…,PR
+
+
+
(
(
R
−
L
+
1
C
2
)
/
2
)
((_{R-L+1}C_2)/2)
((R−L+1C2)/2) 的反演数)。
剩下的就是找到所有 1 ≤ i ≤ N − K + 1 1 \le i \le N-K+1 1≤i≤N−K+1 的 P i , P i + 1 , … , P i + K − 1 P_i,P_{i+1},\dots,P_{i+K-1} Pi,Pi+1,…,Pi+K−1 的反转数。
这可以发现如下:
- 首先查找 P 1 , P 2 , … , P K P_1,P_2,\dots,P_K P1,P2,…,PK 的反转数,用 I I I 表示。
- 对于 i = K + 1 , K + 2 , … , N i=K+1,K+2,\dots,N i=K+1,K+2,…,N ,重复如下操作:
- 从 I I I 中减去 P i − K + 1 , P i − K + 2 , … , P i − 1 P_{i-K+1},P_{i-K+2},\dots,P_{i-1} Pi−K+1,Pi−K+2,…,Pi−1 中小于 P i − K P_{i-K} Pi−K 的元素个数。
- 然后,将 P i − K + 1 , P i − K + 2 , … , P i − 1 P_{i-K+1},P_{i-K+2},\dots,P_{i-1} Pi−K+1,Pi−K+2,…,Pi−1 中大于 P i − K + 1 , P i − K + 2 , … , P i − 1 P_{i-K+1},P_{i-K+2},\dots,P_{i-1} Pi−K+1,Pi−K+2,…,Pi−1 的元素个数加到 I I I 。
- 此时 I I I 为 P i − K + 1 , P i − K + 2 , … , P i P_{i-K+1},P_{i-K+2},\dots,P_i Pi−K+1,Pi−K+2,…,Pi 的反转数。
这可以通过处理段和查询来计算(使用像段树这样的数据结构)。
#include<bits/stdc++.h>
#include<atcoder/segtree>
using namespace std;
using namespace atcoder;
#define mod 998244353
#define inv2 499122177
long long op(long long a,long long b){
if((a+b)>=mod){
return (a+b)-mod;
}
return (a+b);
}
long long e(){
return 0;
}
long long power(long long a,long long b){
long long x=1,y=a;
while(b>0){
if(b&1ll){
x=(x*y)%mod;
}
y=(y*y)%mod;
b>>=1;
}
return x%mod;
}
long long modular_inverse(long long n){
return power(n,mod-2);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long n,k;
cin >> n >> k;
vector<long long> p(n);
for(auto &nx : p){
cin >> nx;
nx--;
}
long long bas=0;
{
segtree<long long,op,e> seg(n);
for(long long i=0;i<n;i++){
bas+=seg.prod(p[i],n);
seg.set(p[i],1);
}
}
long long res=0;
long long sub=0;
long long add=((k*(k-1))/2)%mod; add*=inv2; add%=mod;
segtree<long long,op,e> seg(n);
for(long long i=0;i<k;i++){
sub+=seg.prod(p[i],n); sub%=mod;
seg.set(p[i],1);
}
for(long long i=k;i<=n;i++){
long long cur=(mod+bas-sub+add)%mod;
res+=cur; res%=mod;
if(i==n){break;}
seg.set(p[i-k],0);
sub+=(mod-seg.prod(0,p[i-k])); sub%=mod;
sub+=seg.prod(p[i],n); sub%=mod;
seg.set(p[i],1);
}
res*=modular_inverse(n-k+1); res%=mod;
cout << res << "\n";
return 0;
}