原题展示
代码历程
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int n, m;
int F = 0 , C = 0;
cin >> n >> m;
for(int hang1 = 1; hang1 <= n; hang1++){
for(int lie1 = 1; lie1 <= m; lie1++){
for(int hang2 = hang1; hang2 <= n; hang2++){
for(int lie2 = lie1; lie2 <= m; lie2++){
if(abs(hang1 - hang2) == abs(lie1 - lie2)){
F++;
}else{C++;}
}
}
}
}
cout << F << " " << C << endl;
return 0;
}
暴力枚举,很容易想到。时间和内存超限。
#include <iostream>
using namespace std;
long long n , m , F = 0 , C = 0;
int main(){
cin >> n >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(i == j){
F += (n-i)*(m-j);
}else{
C += (n-i)*(m-j);
}
}
}
cout << F << " " << C << endl;
return 0;
}
属于一种讨巧的做法:正方形数量为n与m减去同一个数的积,长方形数量反之。(每减去一定大小的数就代表着不同的大小的正方形/长方形)一道小学奥数题,考察数学小技巧,而非编程算法。