题意:给定一个大小为n*m( n < = 5 e 4 , m < = 10 n<=5e4,m<=10 n<=5e4,m<=10)的矩阵,其中只有0,1元素,0表示该点可达,1表示不可达,接下来q( q < = 5 e 4 q<=5e4 q<=5e4)次操作:
- 可以选择一个格子翻转
- 询问从(1,x)->(n,y)的方案数,每次只能向下、左、右行走,输出答案取模 1 e 9 + 7 1e9+7 1e9+7
线段树上维护矩阵乘法,合并左右子树保证了路径不会回头。
每个线段树的节点上维护一个系数矩阵dp[i][j]。比如线段树上节点表示行号1~5,那么系数矩阵dp[i][j]就表示从(1,i)->(5,j)的方案数。
合并左右子树时做一个矩阵乘法,dp[i][j]=dp[i][k]*dp[k][j]即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e4+7;
const int mod=1e9+7;
int n,m