AT_abc313_g
本文同步发表于我的博客。
前置知识:【模板】类欧几里得算法
读题,我们发现
然后发现,先做一次操作二,再做一次操作一,序列是不变的,所以有效的操作序列一定是
接着我们设做完所有操作一后的序列为
类欧算即可。记得要单独算只做
code
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
int A[200005],pre[200005];
int calc(int n,int a,int b,int c){
int m=(a*n+b)/c;
if(!a) return (n+1)*(b/c)%mod;
if(a<c&&b<c)return (m*n+mod-calc(m-1,c,c-b-1,a))%mod;
return (n*(n+1)/2%mod*(a/c)+(n+1)*(b/c)+calc(n,a%c,b%c,c))%mod;
}
int n,ans;
signed main(){
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>A[i];
sort(A+1,A+1+n);
ans=A[1]+1,pre[1]=A[1];
for(int i=2;i<=n;i++){
ans+=calc(A[i]-A[i-1],n-i+1,(n-i+1)*A[i-1]+pre[i-1],n)-((n-i+1)*A[i-1]+pre[i-1])/n+A[i]-A[i-1];
pre[i]=pre[i-1]+A[i];
}
cout<<(ans%mod+mod)%mod<<endl;
return 0;
}