#include #include #include using namespace std; long long number_invalid_triangles_from_origin_flat[1024][1024]; long long number_invalid_triangles_from_origin_diag[1024][1024]; long long number_invalid_triangles_from_anywhere[1024][1024]; int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } void count_invalid_triangles() { for (int i = 0; i < 1024; i++) { for (int j = 0; j < 1024; j++) { if (i == 0 && j == 0) { number_invalid_triangles_from_origin_diag[i][j] = 0LL; number_invalid_triangles_from_origin_flat[i][j] = 0LL; number_invalid_triangles_from_anywhere[i][j] = 0LL; } else if (i == 0) { number_invalid_triangles_from_origin_diag[i][j] = 0LL; number_invalid_triangles_from_origin_flat[i][j] = j-1 + number_invalid_triangles_from_origin_flat[i][j-1]; number_invalid_triangles_from_anywhere[i][j] = number_invalid_triangles_from_origin_flat[i][j] + number_invalid_triangles_from_anywhere[i][j-1]; } else if (j == 0) { number_invalid_triangles_from_origin_diag[i][j] = 0LL; number_invalid_triangles_from_origin_flat[i][j] = i-1 + number_invalid_triangles_from_origin_flat[i-1][j]; number_invalid_triangles_from_anywhere[i][j] = number_invalid_triangles_from_origin_flat[i][j] + number_invalid_triangles_from_anywhere[i-1][j]; } else { number_invalid_triangles_from_origin_diag[i][j] = (long long)gcd(i, j) - 1LL + number_invalid_triangles_from_origin_diag[i-1][j] + number_invalid_triangles_from_origin_diag[i][j-1] - number_invalid_triangles_from_origin_diag[i-1][j-1]; number_invalid_triangles_from_origin_flat[i][j] = number_invalid_triangles_from_origin_flat[i-1][j] + number_invalid_triangles_from_origin_flat[i][j-1] - number_invalid_triangles_from_origin_flat[i-1][j-1]; number_invalid_triangles_from_anywhere[i][j] = number_invalid_triangles_from_origin_diag[i][j] * 2 + number_invalid_triangles_from_origin_flat[i][j] + number_invalid_triangles_from_anywhere[i-1][j] + number_invalid_triangles_from_anywhere[i][j-1] - number_invalid_triangles_from_anywhere[i-1][j-1]; } } } } int main() { ifstream fin("triangle.in"); count_invalid_triangles(); for (int cases = 1; ; ++cases) { long long m, n; fin >> m >> n; if (m == 0 && n == 0) { break; } ++m; ++n; cout << "Case " << cases << ": "; cout << ((m * n) * (m * n - 1) / 2LL * (m * n - 2) / 3LL) - number_invalid_triangles_from_anywhere[m-1][n-1] << endl; } return 0; }