题解:B4269 [朝阳区小学组 2019] square
之前被 Hack 了,再写一遍。
题目简述
给定一个长方形的长和宽,求这个长方形分割成若干个小正方形后正方形的边长之和的最小值。注意:正方形大小可不一致。
主要思路
为了使边长和最小,肯定要将每次分割出的正方形最大,否则内部的正方形边长也会计算。在一个长方形中分割出最大的正方形,正方形的边长即为 TLE(#10)。
假设
注意事项
题目中只保证了数据在 long long 范围内,但如果输入是两个 long long 极限,那么一加就会炸,所以要开 unsigned long long。
AC Code
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long double db;
typedef unsigned long long ll;
const int INT_INF = 0x3f3f3f3f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
// ----------------------------
// ----------------------------
// ----------------------------
int main() {
ll a, b, ans;
for (int i = 1; i <= 10; i++) {
cin >> a >> b;
ans = 0;
while (a > 0 && b > 0) {
if (a > b) {
ans += a / b * b;
a %= b;
}
else {
ans += b / a * a;
b %= a;
}
}
cout << ans << endl;
}
return 0;
}