一、二维前缀和
二维前缀和用于计算在矩阵中的任意一个矩形中数字之和,若仅用两个for将其中的所有元素相加,处理所有矩形必然超时,正确做法的复杂度为O(m*n).
从(0,0)开始,
for (int i = 0; i < L; ++i)
for (int j = 0; j < L; ++j) {
if (i) M[i][j] += M[i - 1][j];
if (j) M[i][j] += M[i][j - 1];
if (i && j) M[i][j] -= M[i - 1][j - 1];
}
如果M[i][j]=M[i+2L][j+2L];则全局计算公式为;(加1LL钱要加/号)
LL calc (int n, int m) {
if (n < 0 || m < 0) return 0;
return 1LL * M[L - 1][L - 1] * (n / L) * (m / L) + \
1LL * M[n % L][L - 1] * (m / L) + \
1LL * M[L - 1][m % L] * (n / L) + \
1LL * M[n % L][m % L];
}