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;
}
posted @ 2024-03-28 08:23  Jerry_heng  阅读(15)  评论(0)    收藏  举报