#P14039. [PAIO 2025] Cake

[PAIO 2025] Cake

题目描述

Bartosz 在庆祝他的生日时收到了一个尺寸为 N×MN \times M 的矩形蛋糕。由于他只喜欢方形的蛋糕块,他决定按照一种特殊的方法把整个蛋糕切成正方形。

每次切蛋糕时,Bartosz 都会将当前蛋糕中能切出的最大正方形切下来,并且这个正方形必须至少有三条边贴着当前剩余矩形的边。这个过程不断重复,直到蛋糕被完全切成若干个正方形。

例如,假设矩形的尺寸为 5×45 \times 4,如下图所示:

::::align{center} ::::

在这个例子中,他会先切下一个 4×44 \times 4 的正方形。剩下的蛋糕为 1×41 \times 4 的矩形。然后,他会切出 1×11 \times 1 的正方形共四次。

给定初始蛋糕的尺寸 N×MN \times M,请你计算使用这种切法总共可以得到多少个正方形。

实现细节

你需要实现如下函数:

int32 count_square_cakes(int32 N, int32 M)
  • NN:蛋糕的宽度;
  • MM:蛋糕的高度;
  • 该函数需要返回需要切出的正方形个数;
  • 注意,这个函数每次运行会被调用 TT 次。

输入格式

输入格式如下:

第一行,一个整数 TT,表示测试用例数量。
接下来 TT 行,每行含两个整数 N,MN, M,表示蛋糕的宽度和高度。
评测器会对每组数据调用一次 count_square_cakes(N, M) 并输出结果。

输出格式

对每组数据输出一行,表示将蛋糕全部切成正方形所需的总块数。

提示

样例说明

对于调用 count_square_cakes(5, 4),上述已经解释,答案为 55。

对于调用 count_square_cakes(6, 6),原矩形已经是正方形,答案为 11。

对于调用 count_square_cakes(11, 2),矩形变化为:11×211 \times 2,9×29 \times 2,7×27 \times 2,5×25 \times 2,3×23 \times 2,1×21 \times 2,1×11 \times 1。因此将得到五个 2×22 \times 2 正方形和两个 1×11 \times 1 正方形,共 77 块。

对于调用 count_square_cakes(12, 6),矩形会被切成两个 6×66 \times 6 的正方形。

对于调用 count_square_cakes(18, 5),过程为:18×518 \times 5,13×513 \times 5,8×58 \times 5,3×53 \times 5,3×23 \times 2,1×21 \times 2,1×11 \times 1。所以得到三个 5×55 \times 5 正方形,两个 2×22 \times 2 正方形,两个 1×11 \times 1 正方形,总共 77 块。

数据范围与约定

  • 1≤T≤2×1051 \le T \le 2\times 10^5;
  • 1≤M≤N≤1091 \le M \le N \le 10^9。

提示

  1. 子任务 1(6 分):M=1M = 1;
  2. 子任务 2(11 分):N≤3N \le 3;
  3. 子任务 3(21 分):N≤5000N \le 5000,T≤100T \le 100;
  4. 子任务 4(17 分):N≤5000N \le 5000;
  5. 子任务 5(27 分):N≤105N \le 10^5,T≤100T \le 100;
  6. 子任务 6(18 分):无额外限制。

由 ChatGPT 5 翻译