题意: 解法: 对数组从小到大排序, 枚举每个数作为最大值时的贡献. 对于a[i],需要乘上左边每个数作为最小值的贡献, 用一个变量维护左边每个数作为最小值的贡献即可. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=1e6+5; const int mod=998244353; int a[maxm]; int n; void solve(){ int n;cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+1+n); int ans=0; int pre=0; for(int i=1;i<=n;i++){ ans+=a[i]*a[i]%mod; ans+=a[i]*pre%mod; ans%=mod; /* 维护pre: 1.a[i]不选,那么左边还是pre, 2.a[i]选,那么左边pre+a[i]. 综上得,式子为: pre=pre*2+a[i]. */ pre=(pre*2+a[i])%mod; } cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(0); solve(); return 0; }