T248554 Game11:区间等差序列覆盖问题
题目描述
你需要维护一个序列 $A$ ,初始时全为 $0$,支持:
- `1 l r a d` 将 $A[l,r]$ 赋值为首项为 $a$,公差为 $d$ 的等差序列
- `2 l r a d` 求 $a \times \sum\limits_{i=l}^{r}{A_i} \pmod{d}$
输入格式
第一行为两个整数 $n,m$。
接下来 $m$ 行,每行一个操作。
输出格式
对于每一个 $2$ 操作,输出一个数,表示答案。
说明/提示
$1 \le l\le r \le n$
| 子任务 | 数据规模 |
| :----------: | :----------: |
| $\text{Subtask 0(20pts)}$ | $1 \le n,m \le 10,1 \le s,d \le 10^{3}$|
| $\text{Subtask 1(20pts)}$ | $1 \le n,s,d,m \le 100000$ |
| $\text{Subtask 2(50pts)}$ | 与 $\text{Subtask 1}$ 数据规模相同,但是保证都是 `1` 操作 |
| $\text{Subtask 3(10pts)}$ | 与 $\text{Subtask 1}$ 数据规模相同,但是保证都是 `2` 操作且 $l \le \frac{n}{2} \lt r$ |
**请注意,每一个子任务只有通过所有测试点才能够拿分!**
造数据程序:
```python
from cyaron import *
for i in range(1, 10+1):
test = IO(file_prefix="data/test", data_id=i)
n = randint(1, 10)
m = randint(1, 10)
test.input_writeln(n, m)
for j in range(m):
l = randint(1, n)
r = randint(1, n)
if l > r:
l, r = r, l
test.input_writeln(randint(1, 2), l, r, randint(
1, 1000), randint(1, 1000))
test.output_gen("未命名1.exe")
print(i)
for i in range(11, 20):
test = IO(file_prefix="data/test", data_id=i)
n = randint(1, 100000)
m = randint(1, 100000)
test.input_writeln(n, m)
for j in range(m):
l = randint(1, n)
r = randint(1, n)
if l > r:
l, r = r, l
test.input_writeln(randint(1, 2), l, r, randint(
1, 100000), randint(1, 100000))
test.output_gen("未命名1.exe")
print(i)
test = IO(file_prefix="data/test", data_id=20)
n = randint(1, 100000)
m = randint(1, 100000)
test.input_writeln(n, m)
for j in range(m):
l = randint(1, n)
r = randint(1, n)
if l > r:
l, r = r, l
test.input_writeln(1, l, r, randint(
1, 100000), randint(1, 100000))
test.output_gen("未命名1.exe")
test = IO(file_prefix="data/test", data_id=21)
n = randint(1, 100000)
m = randint(1, 100000)
test.input_writeln(n, m)
for j in range(m):
l = randint(1, n//2)
r = randint(n//2+1, n)
if l > r:
l, r = r, l
test.input_writeln(2, l, r, randint(
1, 100000), randint(1, 100000))
test.output_gen("未命名1.exe")
```