题目背景有一次有人带了一个序列然后在路上被无耻的 xuyiluo2 抢走了。题目描述给你一个长度为 �n 的序列 �a以及一个操作集合 �v每个 �v 中的元素都有 ���op i 、��l i 、��r i 和 ��v i 四个值。如果 ���op i 为 11则表示查询 ��l i 到 ��r i 之内的区间的数的 lcmlcm 模上 9982443539982443
解题思路: 首先,根据输入的序列a和操作集合v,我们可以构建一个长度为n的数组b,用于记录每个位置的数经过操作后的值。
然后,对于每次操作,我们需要根据给定的范围和操作类型来计算答案。
如果操作类型为1,则表示查询区间的最小公倍数,我们可以通过遍历区间中的每个数,将它们的最小公倍数依次计算出来,并取模。
如果操作类型为2,则表示将区间中的每个数加上给定的值,我们只需要遍历区间中的每个数,将它们加上给定的值并取模即可。
最后,我们将每次操作的答案输出即可。
具体实现时,我们可以先构建一个函数lcm_mod用于计算两个数的最小公倍数取模后的值,然后根据操作类型进行相应的处理。
代码实现如下:
MOD = 998244353
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
def lcm_mod(a, b):
return a * b // gcd(a, b) % MOD
n, m = map(int, input().split())
a = list(map(int, input().split()))
v = []
b = [0] * n
for _ in range(m):
op, l, r, val = map(int, input().split())
v.append((op, l, r, val))
q = int(input())
queries = []
for _ in range(q):
s, t = map(int, input().split())
queries.append((s, t))
for s, t in queries:
for i in range(s-1, t):
if v[i][0] == 1:
ans = a[v[i][1]-1]
for j in range(v[i][1], v[i][2]):
ans = lcm_mod(ans, a[j])
b[i] += ans
b[i] %= MOD
elif v[i][0] == 2:
for j in range(v[i][1]-1, v[i][2]):
a[j] += v[i][3]
a[j] %= MOD
for ans in b:
print(ans, end=' ')
print()
时间复杂度分析: 构建数组b的时间复杂度为O(n),对每次操作进行处理的时间复杂度为O(n+m),总的时间复杂度为O(q(n+m))
原文地址: https://www.cveoy.top/t/topic/iITV 著作权归作者所有。请勿转载和采集!