解题思路: 首先,根据输入的序列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))

题目背景有一次有人带了一个序列然后在路上被无耻的 xuyiluo2 抢走了。题目描述给你一个长度为 �n 的序列 �a以及一个操作集合 �v每个 �v 中的元素都有 ���op i 、��l i 、��r i 和 ��v i 四个值。如果 ���op i 为 11则表示查询 ��l i 到 ��r i 之内的区间的数的 lcm⁡lcm 模上 9982443539982443

原文地址: https://www.cveoy.top/t/topic/iITV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录