【学习笔记】[ARC154E] Reverse and Inversion

学好数学

首先对于位置 i i i,设 g ( i ) = ∑ j < i [ Q j > Q i ] − ∑ j > i [ Q j < Q i ] g(i)=\sum_{j<i}[Q_j>Q_i]-\sum_{j>i}[Q_j<Q_i] g(i)=j<i[Qj>Qi]j>i[Qj<Qi],有结论 g ( i ) = i − Q i g(i)=i-Q_i g(i)=iQi

道理很简单, g ( i ) = i − ∑ j ≤ i [ Q j ≤ Q i ] − ∑ j > i [ Q j ≤ Q i ] = i − Q i g(i)=i-\sum_{j\le i}[Q_j\le Q_i]-\sum_{j>i}[Q_j\le Q_i]=i-Q_i g(i)=iji[QjQi]j>i[QjQi]=iQi

那么我们只要算 i i i的期望位置就好了。显然如果 i ∉ [ l , r ] i\notin [l,r] i/[l,r]那么这次操作对 i i i没有影响,那么我们只要算出 i ∈ [ l , r ] i\in [l,r] i[l,r]时对应位置的期望即可。不难暴力算出此时 i i i的期望位置是 n + 1 2 \frac{n+1}{2} 2n+1,所以只要 i i i被操作了一次那么位置就是 n + 1 2 \frac{n+1}{2} 2n+1,否则就是原位置。

#include<bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
using namespace std;
const int mod=998244353;
int n,m,Q[200005];
ll f[200005],res;
ll pw(ll x,ll y=mod-2){
	x%=mod;ll z(1);
	for(;y;y>>=1){
		if(y&1)z=z*x%mod;
		x=x*x%mod;
	}return z;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;for(int i=1;i<=n;i++)cin>>Q[i],res=(res+(ll)i*i)%mod;
    ll X=pw((ll)n*(n+1)/2%mod);
    for(int i=1;i<=n;i++){
    	ll Y=X*i%mod*(n-i+1)%mod;
    	res=(res-pw(1-Y,m)*i%mod*Q[i]%mod)%mod;
    	res=(res-(1-pw(1-Y,m))*(n+1)%mod*pw(2)%mod*Q[i]%mod)%mod;
	}res=res*pw((ll)n*(n+1)/2,m)%mod;
	cout<<(res+mod)%mod;
}
posted @ 2023-01-27 09:48  仰望星空的蚂蚁  阅读(24)  评论(0)    收藏  举报  来源