
这题很简单(一下就能想到是前缀和的提米),但是在处理12345上面需要仔细一点,本来我最开始想到的时候全部累乘在除掉当前数,但是这样就没有把12345考虑进去,如果他本身是12345的话,那么除他以外的乘积并不一定是0,但是如果一边乘一边mod 12345的话那么就会变成0,所以我们要想要除掉本身外,那么可以用二维前缀和,和二维后缀和,
除了他本身的一维前缀和 * 二维后缀和 = 答案 (就是跟一维前缀和和后缀和一样)
- class Solution {
- public:
- vector
int>> constructProductMatrix(vectorint>>& grid) - {
- //二维前缀和
-
- int n = grid.size();
- int m = grid[0].size();
- vector
int>> s(n + 10,vector<int>(m + 10,0)); - vector
int>> c(n + 10,vector<int>(m + 10,0)); - vector
int>> ans(n,vector<int>(m,0)); - //后缀乘积
- long long cc = 1;//初始化要变成1,如果是0的话就不对了
- for(int i = n - 1;i >= 0;i--)
- for(int j = m - 1;j >= 0;j--)
- {
- c[i][j] = cc;
- cc = (long long)(cc * grid[i][j]) % 12345;
- }
-
-
- long long ss = 1;
- for(int i = 0;i < n;i++)
- for(int j = 0;j < m;j++)
- {
- s[i][j] = ss;
- ans[i][j] = (long long)(s[i][j] * c[i][j]) % 12345;
- ss = (long long)(ss * grid[i][j]) % 12345;
- }
-
- return ans;
- }
- };