Посчитаем сколько всего узлов на этом листке: у нас он N клеточек в высоту, значит всего в каждом столбике N+1 узел; у нас он М клеточек в ширину, значит всего в каждой строчке М+1 узел. Значит всего узлов (N+1)*(М+1). Чтобы определьть прямоугольник, надо определить два узла в которых будут противоположные углы: первый узел мы можем выбрать (N+1)*(М второй узел мы можем выбрать N*М мы не можем выбрать тот столбик и тот ряд, в котором у нас стоит первый узел). Тоэсть всего выбрать (N+1)*(М+1)*N*М, но это не так. Рассмотрим весь лист как выбраный прямоугольник. Пусть мы его выбрали так: (0; 0), (N+1; М+1). Этот же прямоугольник мы считали, когда плучали с такими координатами: 1) (N+1; М+1), (0; 0). 2) (N+1; 0), (0; М+1). 3) (0; М+1), (N+1; 0). И так с каждым прямоугольником, тоэсть каждый прямоугольник мы считаем 4 раза, тоэсть конечная формула такова: (N+1)*(М+1)*N*М / 4. Осталось составить прогрмму, которая будет это вичислять. С++: #include <iostream>using namespace std;int main() { int N, M, k; cin >> N >> M; k = (N+1)*(M+1)*N*M / 4; cout << k << endl; return 0; }
Pascal: program Znanija; var N, M, k:integer; begin
#include <iostream>
#define tsar c++
using namespace std;
int segfault() {
int* ptr; ptr = 0;
return *ptr;
}
int main() {
unsigned int n; cin >> n;
unsigned int m; cin >> m;
auto array = new int*[n];
for (size_t idx = 0; idx < n; idx++) {
array[idx] = new int[m];
for (size_t idy = 0; idy < m; idy++)
cin >> array[idx][idy];
}
unsigned int a; cin >> a;
unsigned int b; cin >> b;
int res = 0;
for (size_t idx = a - 1; idx < b; idx++) {
for (size_t idy = 0; idy < m; idy++)
res += array[idx][idy];
}
cout << res;
delete array;
}
Объяснение: