题目背景
可能以后 zzc就去种田了。
题目描述
田地是一个巨大的矩形,然而zzc 每次只能种一个正方形,而每种一个正方形时zzc所花的体力值是正方形的周长,种过的田不可以再种,zzc很懒还要节约体力去泡妹子,想花最少的体力值去种完这块田地,问最小体力值
输入格式
两个正整数x,y,表示田地的长和宽
输出格式
输出最小体力值
输入输出样例
输入 #1
1 10
输出 #1
40
输入 #2
2 2
输出 #2
8
说明/提示
1<=x,y<=10^16
ull a, b, len;
int main() {
cin >> a >> b;
if (a > b) swap(a, b);
ull ans = 0;
/*
while (a && b) {
b -= a;
ans += 4 * a;
if (a > b) swap(a, b);
}
*/
while(a && b){
ans += 4 * a * (b / a);
b %= a;
swap(a, b);
}
cout << ans;
return 0;
}
贪心:每次取两边的最短边作为正方形的边长a,构成一个当前可取的最大正方形,但前长边减去a得剩余矩形。不断迭代,直至正好以剩余正方形的形式结束,此时最短边为0。
数论优化:若长边很长,则可取数次重复的短边作为正方形的边长,此时这样的正方形个数为max(a, b) / min(a, b),长边长度为对短边的取模。多次迭代,直至正好剩余正方形。
如图: