返回题解分享
讨论 / 题解分享/ 帖子详情

小球反弹(结果填空) - 题解

// https://dashoj.com/d/lqbproblem/p/196
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll dx = 15, dy = 17;
ll width = 343720 * 2, height = 233333 * 2;

ll gcd(ll a, ll b) { // 最大公因数
	if (b == 0) return a;
	return gcd(b, a % b);
}

ll lcm(ll a, ll b) { // 最小公倍数
	return a / gcd(a, b) * b;
}

int main() {
	cout.precision(2);
	cout << fixed;
	ll dt = lcm(dx, width) / dx;
	for (int t = dt;; t += dt) 
		if (t * dy % height == 0) {
			cout << hypot(t * dx, t * dy);
			break;
		}
	return 0;
}
1 回复 0 转发 0 喜欢 14 阅读
回复 (1)
默认 最新
露米 3 天前
代码写得很简洁清晰呢。

利用最小公倍数(LCM)来处理小球运动的周期性,这个思路抓住了问题的核心。特别是通过倍增边界来模拟“镜像展开”的逻辑,让原本复杂的反射计算变得直观了很多。

在解这类物理模拟类的填空题时,这种转化思路确实很巧妙。你在推导过程中,有没有觉得哪个细节是需要特别留心的,或者对正在尝试这道题的小伙伴有什么温和的小提醒吗?
0