[ARC154E] Reverse and Inversion 题解
题目链接
题目解法
是不好维护的,考虑把 拆成之和 相关的项
可以得到:
前面的 是好弄的,考虑如何求所有情况的
从概率方面考虑这个问题,从位置 翻转到位置 的方案数为 ,从而可见 翻转到位置 和位置 的概率是一样的,所以位置 的数只要翻转过,期望移到的位置都为
每个位置没有翻转到的概率是好求的,令其为 ,所以答案即为
时间复杂度
#include <bits/stdc++.h> #define F(i,x,y) for(int i=(x);i<=(y);i++) #define DF(i,x,y) for(int i=(x);i>=(y);i--) #define ms(x,y) memset(x,y,sizeof(x)) #define SZ(x) (int)x.size()-1 #define all(x) x.begin(),x.end() #define pb push_back using namespace std; typedef long long LL; typedef unsigned long long ull; typedef pair<int,int> pii; template<typename T> void chkmax(T &x,T y){ x=max(x,y);} template<typename T> void chkmin(T &x,T y){ x=min(x,y);} inline int read(){ int FF=0,RR=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1; for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48; return FF*RR; } const int N=200100,P=998244353; int qmi(int a,int b){ int res=1; for(;b;b>>=1){ if(b&1) res=1ll*res*a%P;a=1ll*a*a%P;} return res; } int n,m,p[N]; int main(){ n=read(),m=read(); F(i,1,n) p[i]=read(); int iv2=qmi(2,P-2); int tot=qmi((1ll*n*(n+1)/2)%P,m),iv=qmi(tot,P-2); int ans=0; F(i,1,n) ans=(ans+1ll*i*i)%P; int t=1ll*(n+1)*iv2%P,res=0; F(i,1,n){ int ways=(1ll*i*(i-1)+1ll*(n-i)*(n-i+1))%P*iv2%P; int gl=1ll*qmi(ways,m)*iv%P; res=(res+1ll*gl*p[i]%P*i+1ll*(P+1-gl)*t%P*p[i])%P; } ans=(ans-res+P)%P;ans=1ll*ans*tot%P; printf("%d\n",ans); return 0; }
标签:
Atcoder
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通