题目描述
你要维护一个 n×n 的矩阵 A,其中第 i 行第 j 列的元素记作 Ai,j。行和列从 1 开始标号。一开始,有 Ai,j=(i+1)jmod998244353。
你需要支持 q 个操作,每个操作是下面两种操作中的一种。
- 1 x1 y1 x2 y2,这里保证 y2−x2=y1−x1。将子矩形 [x1,x2]×[y1,y2] 逆时针旋转 90 度。
- 具体地,令 d=x2−x1+1。
- 首先提取 d×d 的子矩阵 A′,对于所有的 i,j(1≤i,j≤d),令 Ai,j′←Ax1+i−1,y1+j−1。
- 然后将 A′ 旋转,得到一个 d×d 的子矩阵 B′,令 Bi,j′←Aj,d−i+1′。
- 然后将 B′ 填回到 A 中,对所有的 i,j(1≤i,j≤d),令 Ai+x1−1,j+y1−1←Bi,j′。
- 2 x1 y1 x2 y2 d。将子矩形 [x1,x2]×[y1,y2] 内所有的元素加 d。
- 具体地,对于每个 i(x1≤i≤x2)、j(y1≤j≤y2),令 Ai,j←Ai,j+d。
你需要在所有操作结束之后,输出这个矩阵。由于输出可能很大,请输出
(i=1∑nj=1∑nAi,j×12345(i−1)n+j)mod1000000007的结果。
输入格式
第一行两个整数 n,q 表示矩阵大小和操作个数。
接下来 q 行,每行若干个数,表示上面的某种操作。
输出格式
输出一个整数,表示答案对 1000000007 取模的结果。
提示
【样例 #1 解释】
对于第一个样例,矩阵分别为
2345491625827641251681256625→2345168425812791252566416625→26781611728812791252566416625→21168167728812791252566416625→71168217728862791252616416625其中每个旋转操作对应的数字用红色表示,加操作对应的数字用蓝色表示。
【样例 #3】
见附件中 matrix/matrix3.in
与 matrix/matrix3.ans
,这个样例满足测试点 5∼6 的条件限制。
【样例 #4】
见附件中 matrix/matrix3.in
与 matrix/matrix3.ans
,这个样例满足测试点 9∼10 的条件限制。
【数据范围】
对于所有的数据,保证 1≤n≤3000,1≤q≤3000。
对于每个操作,保证 1≤x1≤x2≤n,1≤y1≤y2≤n,1≤d≤109。
具体如下:
测试点编号 |
n≤ |
q≤ |
特殊性质 |
1 |
100 |
3000 |
无 |
2 |
3000 |
A |
3∼4 |
2000 |
B |
5∼6 |
3000 |
7∼8 |
2000 |
无 |
9∼10 |
3000 |
特殊性质 A:保证没有第一类旋转操作。
特殊性质 B:保证没有第二类加法操作。