题目:
题意解析:
题解:
错误思路:
这个题目我第一反应,是大数取余,但是时间超时了。因为每次输出都要遍历一遍字符串数组,所以超时。
正确思路:
(1)用数字进行计算,在输出为1或者2的时候,对每一次操作都要进行取余操作。
(2)操作为2的时候要特别注意,ans-sum[a.size()-1]*a.front()这个值可能为负数,在取余之后要加mod再取余一次。
(3)sum数组,是记录对于每一个数的前一个数取余的结果。
代码:
#include<bits/stdc++.h>
using namespace std;
long long int n,m;
long long int mod=998244353;
long long int sum[600009];
queue<int> a;
int main() {
cin>>n;
sum[0]=1;
for(int i=1;i<600001;i++){
sum[i]=(sum[i-1]*10)%mod;
}
long long int ans=1;
a.push(1);
for(int i=0; i<n; i++) {
int k,l;
cin>>k;
if(k==1) {
cin>>l;
ans=(ans*10+l)%mod;
a.push(l);
} else if(k==2) {
ans=((ans-sum[a.size()-1]*a.front())%mod+mod)%mod;
a.pop();
} else if(k==3) {
cout<<ans<<endl;
}
}
return 0;
}