题解 [ARC124E] Pass to Next
闲话
组合意义 dp,化式子大法好,暴力出奇迹。
\text{Solution}
\text{Part1}
在化式子之前,我们先来做一些准备工作。
设
考虑一下如何去重,对于
至于怎么求,我们用
再改写一下这个不太好看的式子。
\text{Part2}
设
暴力展开一些项,
我们用分配率把式子拆开,先考虑标红的项,
在
记
同理,
记
记
记
现在式子变成,
\text{Part3}
我们再来展开一项,
现在
以此类推,做
这时
初始时,
完结撒花。
\text{Code}
#include<bits/stdc++.h>
#define ll long long
#define mid ((l+r)>>1)
#define cout cerr
#define debug cout<<"debug"<<endl;
using namespace std;
const int N=1e5+5;
const int mod=998244353;
const ll inv2=499122177;
const ll inv6=166374059;
int n;
ll a[N];
inline int read() {
int x=0,f=0;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=1; ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return f?-x:x;
}
inline void inc(ll &x,int y) {x+=y-mod;x+=(x>>63)&mod;}
inline ll S1(ll x) {return x*(x+1)%mod*inv2%mod;}
inline ll S2(ll x) {return x*(x+1)%mod*(2*x+1)%mod*inv6%mod;}
inline ll calc(ll op) {
ll f0=a[1],fp=-1,fn=1,fnp=0;
for(int i=2;i<=n;i++) {
ll t0=0,tp=0,tn=0,tnp=0;
inc(t0,f0*(a[i-1]+op)%mod*a[i]%mod);
inc(t0,f0*S1(a[i-1])%mod);
inc(t0,fp*S1(a[i-1])%mod*a[i]%mod);
inc(t0,fp*S2(a[i-1])%mod);
inc(tp,(mod-f0*(a[i-1]+op)%mod)%mod);
inc(tp,(mod-fp*S1(a[i-1])%mod)%mod);
inc(tn,fn*(a[i-1]+op)%mod*a[i]%mod);
inc(tn,fn*S1(a[i-1])%mod);
inc(tn,fnp*S1(a[i-1])%mod*a[i]%mod);
inc(tn,fnp*S2(a[i-1])%mod);
inc(tnp,(mod-fn*(a[i-1]+op)%mod)%mod);
inc(tnp,(mod-fnp*S1(a[i-1])%mod)%mod);
f0=t0,fp=tp,fn=tn,fnp=tnp;
}
ll ans=0;
inc(ans,f0*(a[n]+op)%mod);
inc(ans,fp*S1(a[n])%mod);
inc(ans,fn*S1(a[n])%mod);
inc(ans,fnp*S2(a[n])%mod);
return ans;
}
int main()
{
freopen("random_01.txt","r",stdin);
n=read();
for(int i=1;i<=n;i++) a[i]=read();
printf("%lld",(calc(1)-calc(0)+mod)%mod);
return 0;
}