赞
踩
C . L R − r e m a i n s C.LR-remains C.LR−remains 每次测试时限: 2 秒 每次测试时限:2 秒 每次测试时限:2秒 每次测试的内存限制: 256 兆字节 每次测试的内存限制:256 兆字节 每次测试的内存限制:256兆字节
给你一个长度为 n n n 的数组 a a a 、一个正整数 m m m 和一串长度为 n n n 的命令。每条命令要么是字符 “L”,要么是字符 “R”。
按照字符串 s s s 中的顺序处理所有 n n n 命令。处理一条命令的步骤如下:
注意,每次移动后,数组 a a a 的长度都会减少 1 1 1 ,处理完所有命令后,数组 a a a 将为空。
请编写一个程序,按照字符串 s s s 中的顺序(从左到右)处理所有命令。
第一行包含一个整数 t t t ( 1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1≤t≤104 ) - 输入中测试用例的数量。然后是 t t t 个测试用例的描述。
输入的每个测试用例由三行组成。
第一行包含两个整数 n n n 和 m m m ( 1 ≤ n ≤ 2 ⋅ 1 0 5 , 1 ≤ m ≤ 1 0 4 1 \le n \le 2\cdot10^5, 1 \le m \le 10^4 1≤n≤2⋅105,1≤m≤104 ) - 数组的初始长度 a a a 和余数取值。
第二行包含 n n n 个整数 a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,…,an ( 1 ≤ a i ≤ 1 0 4 1 \le a_i \le 10^4 1≤ai≤104 ) - 数组 a a a 的元素。
第三行包含一个字符串 s s s ,由 n n n 字符 "L "和 "R "组成。
保证测试中所有测试用例的 n n n 值之和不超过 2 ⋅ 1 0 5 2\cdot10^5 2⋅105 。
对于每个测试用例,输出 n n n 个整数 b 1 , b 2 , … , b n b_1, b_2, \dots, b_n b1,b2,…,bn ,其中 b i b_i bi 是在开始执行 i i i -th 命令时,数组 a a a 当前状态的所有元素除以 m m m 的乘积的余数。
代码:
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; const int mod = 1e9 + 7; const int N = 200010; int a[N]; void solve() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++)scanf("%d",&a[i]); string s; cin>>s; s='0'+s; int l=1, r=n; for(int i=1;i<=n-1;i++) if(s[i]=='L')l++; else r--; vector<int>ans; int res=a[l]%m; ans.push_back(res); for(int i=n-1;i>=1;i--) { if(s[i]=='L') { l--; res=(res*a[l])%m; ans.push_back(res); } else { r++; res=(res*a[r])%m; ans.push_back(res); } } for(int i=n-1;i>=0;i--)cout<<ans[i]<<" "; cout<<endl; } int main() { int t; cin>>t; while(t--) { solve(); } return 0; }
解题思路:
因为
正着做
的话需要进行除法运算
,而除法对取模运算不是封闭
的,不能随意取模
,因此需要使用逆元
,但是题目中的m与a[i]并不一定互质
,所以无法求出逆元
,因此该方法无法使用。
既然
正着做
不行,那么就试试看倒着做
,而倒着做
就变成了乘法运算
,而乘法对取模运算是封闭
的,可以随意取模
,因此这道题可以通过倒着做解决
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。