【AtCoder】Beginner Contest 380-G.Another Shuffle Window

题目链接

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 NK+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+K1 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 1i<jN 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} Q0(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×QP(mod998244353), 0R<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 NK+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+K1

反转数是多少?

  • 序列 ( 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 1i<jN 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} Q0(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×QP(mod998244353), 0R<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 1KN2×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,,PL1
  • 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) ((RL+1C2)/2) 的反演数)。

剩下的就是找到所有 1 ≤ i ≤ N − K + 1 1 \le i \le N-K+1 1iNK+1 P i , P i + 1 , … , P i + K − 1 P_i,P_{i+1},\dots,P_{i+K-1} Pi,Pi+1,,Pi+K1 的反转数。

这可以发现如下:

  • 首先查找 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} PiK+1,PiK+2,,Pi1 中小于 P i − K P_{i-K} PiK 的元素个数。
  • 然后,将 P i − K + 1 , P i − K + 2 , … , P i − 1 P_{i-K+1},P_{i-K+2},\dots,P_{i-1} PiK+1,PiK+2,,Pi1 中大于 P i − K + 1 , P i − K + 2 , … , P i − 1 P_{i-K+1},P_{i-K+2},\dots,P_{i-1} PiK+1,PiK+2,,Pi1 的元素个数加到 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 PiK+1,PiK+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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值