Codeforces Round 927 (Div. 3) ---->C - LR-remainders(含常见错误分析)

文章讲述了在编程中遇到的错误,如误计算乘积规模,以及如何通过转换思路,使用栈数据结构将除法转换为乘法取余,从而解决给定字符串问题的C++代码实现。
摘要由CSDN通过智能技术生成

一,这题会出现的错误

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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值