AT_abc298_d的题解
(一)
这题可以运用同余的性质,预处理出每一位 \(s_k=10^k \bmod\ 998244353\)。
记录输入的每一位 \(a_i\),第一位的下标 \(be\),最后一位下标 \(en\)。
对于操作 1,\(ans=ans\times10+x,en=en+1\)。
对于操作 2,\(ans=ans-a_{be}\times s_{en-be+1},be=be+1\)。
其中 \(en-be+1\) 是当前位数。
对于操作 3,输出 \(ans\)。
以上操作默认都是在 \(\bmod\ 998244353\) 情况下。
(二)
AC 代码。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int md=998244353;
const int mx=6e5;
int q,s[mx],ans=1,be=1,en=1,a[mx];
signed main(){
s[1]=1;
a[1]=1;
for(int i=2;i<=mx;i++)s[i]=(s[i-1]*10)%md;
cin>>q;
while(q--){
int op,x;
cin>>op;
if(op==1){
cin>>x;
a[++en]=x;
ans=(ans*10+x)%md;
}
if(op==2){
ans=(ans-a[be]*s[en-be+1]+md*10)%md;
be++;
}
if(op==3)cout<<ans<<endl;
}
return 0;
}

浙公网安备 33010602011771号