Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35582 | hi_hi | 【J】T4 | C++ | 通过 | 100 | 253 MS | 9640 KB | 2245 | 2024-12-12 21:10:39 |
#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; } 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[j]=ck[j]; } 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){ if(dp[t]!=0)break; long long now=c[t]; dp[t]=dp[ji-1]+((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; dp[t]=dp[ji-1]+ck[t]+(ji/2)*now; dp[t]%=md; if(c[t+1]==-1){ ji=t+1; t=t+2; break; } } } for(int i=1;i<=n*2-1;i+=2){ sum+=dp[i]; sum%=md; } printf("%lld\n",sum); } }