题目
Description
It is the king's birthday before the military parade . The ministers prepared a rectangle cake of size n \times m(1\le n, m \le 10000)2×22×2
Input
The first line contains a number T(T \leq 1000), the number of the testcases.
For each testcase, the first line and the only line contains two positive numbers n , m(1\le n, m \le 10000)1×11×1
Output
For each testcase, print a single number as the answer.
Sample Input
2 2 3 2 5
Sample Output
3 4
hint:
For the first testcase you can divide the into one cake of , 2 cakes of
题解
把长方形按照一刀一刀切成正方形,最后求出所有正方形的个数
如图,2*3的长方形,第一刀可以分割成2*2的正方形和1*2的长方形;
第二刀可以分成两个1*1的正方形
即3个正方形
可以看出,对于一个n*m的长方形(n>m),其操作为分成m*m的正方形和(n-m)*m的长方形
提取出相同的操作,写成递归来统计个数
//a长 b宽 int DFS(int a, int b) { if (a == b) return 1; return 1 + DFS(max(a - b, b), min(a - b, b)); }
代码
/* By:OhYee Github:OhYee Email:oyohyee@oyohyee.com Blog:http://www.cnblogs.com/ohyee/ かしこいかわいい? エリーチカ! 要写出来Хорошо的代码哦~ */ #include <cstdio> #include <algorithm> #include <iostream> using namespace std; //a长 b宽 int DFS(int a, int b) { if (a == b) return 1; return 1 + DFS(max(a - b, b), min(a - b, b)); } void Do() { int n, m; scanf("%d%d", &n, &m); printf("%d\n", DFS(max(m, n), min(m, n))); } int main() { int T; scanf("%d", &T); while (T--) Do(); return 0; }