提交时间:2024-12-12 19:50:23
运行 ID: 35577
#include<bits/stdc++.h> using namespace std; long long _,n,c[500005],dp[500005],ck[500005]; long long md=998244353; int main(){ scanf("%lld%lld",&_,&_); while(_--){ long long flag1=1,tt=0,flag2=1; scanf("%lld",&n); for(int i=1;i<=n*2-1;i++){ if(i%2==1){ scanf("%lld",&c[i]); } else{ char t; scanf(" %c",&t); if(t=='+'){ c[i]=-1; } else{ c[i]=-2; } } } memset(dp,0,sizeof(dp)); memset(ck,0,sizeof(ck)); long long sum=0; for(int i=1;i<=n*2-1;i+=2){ if(c[i-1]==-2 || i==1)ck[i]=ck[i-2]*c[i]+c[i]; else ck[i]=c[i]; ck[i]%=md; //printf("%lld ",ck[i]); } long long t=-1; for(int i=2;i<=n*2-1;i+=2){ if(c[i]==-1){ for(int j=1;j<=i;j++){ sum+=ck[j]; sum%=md; } dp[i-1]=sum; t=i+1; break; } } sum=0; if(t==-1){ long long sum=0; for(int i=1;i<=n*2-1;i++){ sum+=ck[i]; sum%=md; } printf("%lld\n",sum); continue; } long long ji=t-1; while(t!=-1 && t<2*n-1){ long long now=c[t]; dp[t]=dp[t-2]+((ji)/2+1)*c[t]; dp[t]%=md; if(t==2*n-1)break; if(c[t+1]==-1){ ji=t+1; } while(t<2*n-1){ t+=2; if(c[t-1]==-1)now=c[t]; else now*=c[t]; now=now%md; //printf("///%lld %lld %lld %lld %lld/// ",ji,t,dp[ji-1],ck[t],now); dp[t]=dp[ji-1]+ck[t]+(ji/2)*now; dp[t]%=md; // printf("..%lld..",now); if(c[t+1]==-1){ ji=t+1; t=t+2; break; } } } for(int i=1;i<=n*2-1;i+=2){ // printf("%lld ",dp[i]); sum+=dp[i]; sum%=md; } printf("%lld\n",sum); } }