题解
给你一个n × \times ×m的矩阵,行列从1开始标号,第 i i i行 j j j列的值是 ( i − 1 ) ∗ m + j (i-1)*m+j (i−1)∗m+j。现在要求你实现以下操作。
1、交换两行。
2、交换两列。
3、求一个子矩阵的做k次前缀和之后的和,对 1 0 9 + 7 10^9+7 109+7取模
对于100%的数据,保证 1 ⩽ n , m , q ⩽ 1 0 5 , 0 ⩽ k ⩽ 10 1\leqslant n,m,q\leqslant 10^5,0\leqslant k\leqslant 10 1⩽n,m,q⩽105,0⩽k⩽10
测试点 | n , m , q ⩽ n,m,q\leqslant n,m,q⩽ | k k k | |
---|---|---|---|
0 | 200 200 200 | ||
1 | 5000 5000 5000 | = 0 =0 =0 | |
2,3 | 5000 5000 5000 | 没有修改 | |
4 | 5000 5000 5000 | ||
5,6 | = 0 =0 =0 | ||
7 | 没有修改 | ||
8,9 |
题解
考虑做 k k k次前缀和的过程,如果是一维的话就是每个位置每次可以贡献到它或它之后的任意一个位置,求 k k k次之后贡献到 n n n的方案数;而二维的话两维是互相不干扰的所以就是两个组合数相乘。对于 i i i行 j j j列本身的值,我们把它看做 a i + b j a_i+b_j ai+bj,两者分开算,列出式子把组合数化简一下,问题剩下求一个包含 x 2 x_2 x2和 i i i( i i i从 x 1 x1 x1到 x 2 x_2 x2)的二元多项式,而两者的次数都是 k k k级别的,把它展开得到每一项的系数,用树状数组维护 a i ∗ i k a_i*i^k ai∗ik的前缀和即可。