引入
在3B1B的一期视频中讲到了一种运用镜像对称来化简桌球的碰撞问题,那么能不能求这样一个问题:
在不考虑摩擦、转动的桌球上,已知入射点位置和方向,能否找到某个次数p,使得在p次与台面边缘的碰撞后回到出发点?
建模
由于桌球是圆的,所以碰撞时桌球与台面接触的边界是圆弧,因此我们考虑圆心与台面接触的边界,即圆心与台面接触的圆弧。
这里我们先考虑一般的情况,即桌球与台面的边界斜碰,而桌球与台面正碰以及与边界的角正碰都必有碰撞次数1使得桌球返回原点。
我们不妨先考虑长为a、宽为b的桌球台面,其边界即为碰撞边界,某个球在 \( \left ( x_{0}, y_{0} \right ) \) 的位置,其入射向量为 \( \vec{s} = \left ( u_{0}, v_{0} \right ) \) 如图建立坐标系:

考虑多次反弹后有以下模型:
当桌球与任意边界碰撞时,以该边界为对称轴,作其边界的镜像,桌球与该边界碰撞后,其位置与入射向量均变为镜像的对应值,即:

本文还在施工,未完待续…
文章作者: Meta Xiao
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 浮生若梦!
相关推荐

2025-10-27
WZU ACM集训队10.25训练D题补
题目大意定义函数 $f(n)$ 为: f(n)=\left\{\begin{matrix} 1 \ ,& if \ n = 0\\ f(n\pmod{10})^{f(n/10)} \ , &else. \end{matrix}\right.特别地 $0^0=1$ 求对于 $n\in[2,1e9]$ 的 $f(n)\mod m$ 思路对于题目的函数 $f(n)$,我们假设一个多位十进制数 (a_n a_{n-1} \cdots a_1 a_0)_{10} 那么对于该函数可以递归成以下形式: f(n)= a_0^{a_1^{a_2^\cdots}} \mod m \tag{*}即求 $(*)$ 式的结果。 首先我们马上会想到用快速幂和记忆化存储 f(n)的值,但是这样递归很容易溢出,即使大数模拟也会超时,我们下面考虑如何用数论化简。 欧拉定理欧拉定理指出,对于整数 $m\gt0$ 和整数 $a$ ,且 $\mathbf{gcd}(a,m)=1$ ,有: a^{\varphi(m)}\equiv 1 \pmod m下面我们给出该定理的应用,考虑这个数 $a^b\mod...

2025-09-08
abc422 my editorial
这次的abc打的很愉快,记录下。 传送门->abc422 AA题就是输入输出题,直接模拟即可。 12345678910111213141516171819202122#pragma GCC optimize("O2")#pragma GCC optimize("O3")#pragma GCC optimize("Ofast")#pragma GCC optimize("unroll-loops")#include <bits/stdc++.h>using namespace std;#define endl '\n'int a,b;char c;int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> a >> c >> b; if(b==8)cout << a+1 << c <<...

2025-03-29
校赛G题题解
需要提前知道的知识点积 \vec{a} \cdot \vec{b} = |\vec{a}| |\vec{b}| \cos \theta其中 $\theta$ 是两个向量之间的夹角。 叉积 \vec{a} \times \vec{b} = |\vec{a}| |\vec{b}| \sin \theta \vec{n}其中 $\theta$ 是两个向量之间的夹角,$\vec{n}$ 是 $\vec{a}$ 和 $\vec{b}$ 所在平面的法向量。 那么可以用行列式表达为: \vec{a} \times \vec{b} = \begin{vmatrix} \vec{i} & \vec{j} & \vec{k} \\ a_x & a_y & a_z \\ b_x & b_y & b_z \end{vmatrix}这个行列式可以展开为: \vec{a} \times \vec{b} = (a_y b_z - a_z b_y) \vec{i} - (a_z b_x - a_x b_z) \vec{j} + (a_x b_y - a_y b_x)...

2025-03-24
洛谷题解--记3月24日训练
题目1P2241 统计方形(数据加强版)题目背景:1997年普及组第一题 题目描述有一个 $n \times m$ 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。 输入格式: 一行,两个正整数 $n,m$($n \leq 5000,m \leq 5000$)。 输出格式: 一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。 输入输出样例 #1输入 #1 12 3 输出 #1 18 10 题解方法1数学公式求解 思路首先,我看到这题就回忆起了高中的排列组合,对于一个 $n \cdot m$ 的棋盘,我们可以把它看作n行m列。 选择其中的行列做正方形,那么对于边长为 $k$ 的正方形,对于 $n$ 行有 $n-k+1$ 总选择,对于 $m$ 列有 $m-k+1$ 总选择,所以边长为 $k$ 的正方形有 $(n-k+1) \cdot (m-k+1)$ 个。 那么,求出所有的正方形应该是在一个正方形棋盘中划分,这个正方形棋盘的边长显然是 $min(m,n)$ ,所以正方形的个数就是 $\sum_{i=1}^{min(m,n)}(n-i+1) \cdot...

2025-11-12
牛客2025秋季算法编程训练联赛5-基础组题解
本次比赛是我打a以来最接近AK的一次,打的也非常顺,看了下大部分是构造以及数学题,我还是喜欢这两类。 比赛链接牛客2025秋季算法编程训练联赛5-基础组 A-模板题意给出有且仅由大写字母构成,长度为 $n$ 的字符串s1 以及长度为 $m$ 的字符串s2,求最小操作可以将其中一个字符串转化为另一个,操作有: 将其中任意一个字母替换为另一个 把最后一个字母删除 在尾部添加一个字母 其中,$1 \leq n,m \leq 10^5$ 思路既然可以修改任意一个,或者修改(删除添加)末尾,那么直接统计在 $i:=0 \sim \min(n,m)$ 中s1[i]!=s2[i] 的个数(超过min(n,m)的直接删了,里面的修改),最后加上n和m的差输出即可 代码12345678910111213141516171819#include <bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); cin.tie(0); int n,m; cin >> n...
评论
