#include long long unsigned int countSubSquares(int sideLengthA,int sideLengthB) { int xSize, ySize, count = 0; for (xSize = 1; xSize <= sideLengthA; xSize++) { for (ySize = 1; ySize <= sideLengthB; ySize++) { int dA = sideLengthA - xSize + 1; //gives wiggle room int dB = sideLengthB - ySize + 1; //gives wiggle room count += dA * dB; } } return count; } int main() { int sideLengthA = 1; int sideLengthB = 1; long long int max = 2000000; long long int ld = max; long long int x = 0; printf("%llu\n", countSubSquares(3,2)); for (sideLengthA = 1; sideLengthA < max; sideLengthA++) { for (sideLengthB = 1; sideLengthB < max; sideLengthB++) { x = countSubSquares(sideLengthA, sideLengthB); if (abs(x - max) < ld) { printf("%d:%d (%llu) %llu\n", sideLengthA, sideLengthB, (sideLengthA * sideLengthB), x); ld = abs(x - max); } if (x > max) break; } } }