#P14039. [PAIO 2025] Cake

[PAIO 2025] Cake

Description

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

Input Format

输入格式如下:

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

Output Format

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

Hint

样例说明

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

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

对于调用 count_square_cakes(11, 2),矩形变化为:11×211 \times 29×29 \times 27×27 \times 25×25 \times 23×23 \times 21×21 \times 21×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 513×513 \times 58×58 \times 53×53 \times 53×23 \times 21×21 \times 21×11 \times 1。所以得到三个 5×55 \times 5 正方形,两个 2×22 \times 2 正方形,两个 1×11 \times 1 正方形,总共 77 块。

数据范围与约定

  • 1T2000001 \le T \le 200000
  • 1MN1091 \le M \le N \le 10^9

提示

  1. 子任务1(6分):M=1M = 1
  2. 子任务2(11分):N3N \le 3
  3. 子任务3(21分):N5000N \le 5000T100T \le 100
  4. 子任务4(17分):N5000N \le 5000
  5. 子任务5(27分):N100000N \le 100000T100T \le 100
  6. 子任务6(18分):无额外限制

由 ChatGPT 5 翻译