AT_arc231_e [ARC231E] Odd Inversion 题解
这个题居然只评作蓝吗……我觉得,有紫吧。虽然说最终的公式很短代码也很简单,但是这个推导的过程还是非常难想到的吧 qwq。
我们考虑 dp。令
思考在已知
首先当取
那么考虑了上面的情况之后只剩下
显然当
然后只剩下
综合上面的三种情况,可以得到完整的转移方程:
初值
::::success[code && submission]
#include<bits/stdc++.h>
#define LL long long
#define UInt unsigned int
#define ULL unsigned long long
#define LD long double
#define pii pair<int,int>
#define pLL pair<LL,LL>
#define pDD pair<LD,LD>
#define fr first
#define se second
#define pb push_back
#define isr insert
#define _i128 __int128
using namespace std;
const int N = 2e5+5;
const LL MOD = 998244353;
LL T,n,a[N],mul[N],dp[N];
LL read(){
LL su=0,pp=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')pp=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){su=su*10+ch-'0';ch=getchar();}
return su*pp;
}
int main(){
//freopen("odd.in","r",stdin);
//freopen("odd.out","w",stdout);
T=read();
while(T--){
n=read();mul[0]=1;
for(int i=1;i<=n;i++)
a[i]=read(),mul[i]=mul[i-1]*a[i]%MOD;
dp[0]=0,dp[1]=0;
for(int i=2;i<=n;i++){
dp[i]=(a[i]-a[i-1])*dp[i-1]%MOD;
dp[i]+=a[i-1]*dp[i-2]%MOD;
dp[i]+=(a[i-1]*(a[i-1]-1)/2)%MOD*mul[i-2]%MOD;
dp[i]%=MOD;
}
cout<<dp[n]<<"\n";
}
return 0;
}
::::
如果本篇题解对你有帮助的话,麻烦你点一个小小的赞,真是太感谢啦!