一,这题会出现的错误
1.分析错了所有数相乘的大小,以为是2e9,其实是2e5个1e4相乘。
2.看到除法取余想到逆元来做,但是逆元有一个硬性条件,就是m必须是质数。
二,思路
既然除法不好求余数,那么就将他转换成乘法求余数。由题可知,题目是按照字符串从左到右的循序来减去两边元素(除掉两边的其中一个),不妨我们逆过来,从右到左依次乘以两边元素的一个(可以用栈来实现具体看代码)。
三.Code
#include <iostream>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
ll arr[N];
void sovle() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> arr[i];
string str;
cin >> str;
//根据先进后出的原则储存要操作的数
stack<int> sta;
int l = 1, r = n;
for (int i = 0; i < str.size(); i++) {
if (str[i] == 'L') sta.push(arr[l++]);
else sta.push(arr[r--]);
}
//储存结果便于输出
stack<int> res;
ll num = 1;
//依次处理str.size()-1次操作,保存结果
for (int i = 0; i < str.size(); i++) {
num = (num * sta.top()) % m;
sta.pop();
res.push(num);
}
//输出
for (int i = 0; i < str.size(); i++) {
cout << res.top() << " ";
res.pop();
}
cout << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
sovle();
}
return 0;
}