P14039 [PAIO 2025] Cake

题目描述

Bartosz 在庆祝他的生日时收到了一个尺寸为 $N \times M$ 的矩形蛋糕。由于他只喜欢方形的蛋糕块,他决定按照一种特殊的方法把整个蛋糕切成正方形。 每次切蛋糕时,Bartosz 都会将当前蛋糕中能切出的最大正方形切下来,并且这个正方形必须至少有三条边贴着当前剩余矩形的边。这个过程不断重复,直到蛋糕被完全切成若干个正方形。 例如,假设矩形的尺寸为 $5 \times 4$,如下图所示: ::::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/ko4na9zi.png?x-oss-process=image/resize,m_lfit,h_170) :::: 在这个例子中,他会先切下一个 $4 \times 4$ 的正方形。剩下的蛋糕为 $1 \times 4$ 的矩形。然后,他会切出 $1 \times 1$ 的正方形共四次。 给定初始蛋糕的尺寸 $N \times M$,请你计算使用这种切法总共可以得到多少个正方形。 ### 实现细节 你需要实现如下函数: ```cpp int32 count_square_cakes(int32 N, int32 M) ``` * $N$:蛋糕的宽度 * $M$:蛋糕的高度 * 该函数需要返回需要切出的正方形个数 * 注意,这个函数每次运行会被调用 $T$ 次

输入格式

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

输出格式

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

说明/提示

### 样例说明 对于调用 `count_square_cakes(5, 4)`,上述已经解释,答案为 $5$。 对于调用 `count_square_cakes(6, 6)`,原矩形已经是正方形,答案为 $1$。 对于调用 `count_square_cakes(11, 2)`,矩形变化为:$11 \times 2$,$9 \times 2$,$7 \times 2$,$5 \times 2$,$3 \times 2$,$1 \times 2$,$1 \times 1$。因此将得到五个 $2 \times 2$ 正方形和两个 $1 \times 1$ 正方形,共 $7$ 块。 对于调用 `count_square_cakes(12, 6)`,矩形会被切成两个 $6 \times 6$ 的正方形。 对于调用 `count_square_cakes(18, 5)`,过程为:$18 \times 5$,$13 \times 5$,$8 \times 5$,$3 \times 5$,$3 \times 2$,$1 \times 2$,$1 \times 1$。所以得到三个 $5 \times 5$ 正方形,两个 $2 \times 2$ 正方形,两个 $1 \times 1$ 正方形,总共 $7$ 块。 # 数据范围与约定 * $1 \le T \le 200000$ * $1 \le M \le N \le 10^9$ # 提示 1. 子任务1(6分):$M = 1$ 2. 子任务2(11分):$N \le 3$ 3. 子任务3(21分):$N \le 5000$,$T \le 100$ 4. 子任务4(17分):$N \le 5000$ 5. 子任务5(27分):$N \le 100000$,$T \le 100$ 6. 子任务6(18分):无额外限制 由 ChatGPT 5 翻译