试题 A: 握手问题
本题总分: 5 5 5 分
思路:组合计数,用为 50 50 50 个人握手的总方案数 C 50 2 C^{2}_{50} C502 ,减去七个人彼此没有握手的方案数 C 7 2 C^{2}_{7} C72 即为答案。
握手问题#include <bits/stdc++.h>
#define int long long
#define db long double
#define all(f) f.begin(), f.end()
#define rall(f) f.rbegin(), f.rend()
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define mod 1000000007
#define MOD 998244353
#define x first
#define y second
using namespace std;
const int N = 2e5 + 10, M = 1010, S = 25;
typedef pair<int, int> pii;
const db eps = 1e-8;
const db pi = acos(-1);
int f[N], n, m;
inline void solve() {
int ans = 50 * 49 / 2 - 7 * 6 / 2;
cout << ans << '\n';
//1204
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int _ = 1;
cout << fixed << setprecision(8);
// cin >> _;
while(_ --) {
solve();
} return _ ^ _;
}
答案: 1204 1204 1204
试题 B: 小球反弹
本题总分: 5 5 5 分
思路:由题意,小球返回原点时,在长和宽两个方向所经历的路程均为长方形的长和宽的偶数倍,推公式 (拒绝玄学,开始推公式),设小球返回原点经历的 x , y x,y x,y 分量的路程分别为 S x , S y S_x,S_y Sx,Sy ,速度分别为 d x , d y d_x,d_y dx,dy ,每次返回原点经历 k x k_x kx 个矩形长, k y k_y ky 个矩形宽,所用时间为 t t t ,有:
{ S x = 2 k x ∗ x = t ∗ d x S y = 2 k y ∗ y = t ∗ d y ⇒ k x k y = d x ∗ x d y ∗ y \begin{cases}S_x=2k_x*x=t*d_x\\S_y=2k_y*y=t*d_y\end{cases}\Rightarrow\frac{k_x}{k_y}=\frac{d_x*x}{d_y*y} { Sx=2kx∗x=t∗dxSy=2ky∗y=t∗dy⇒kykx=dy∗ydx∗x
得到的 k x 、 k y k_x、k_y kx、ky 为小球每次返回原点时经历的矩形的长和宽的偶数倍,小球第一次返回原点所经历的矩形长和宽倍数为:
{ k x 1 = k x g c d ( k x , k y ) k y 1 = k y g c d ( k x , k y ) \begin{cases} k_{x_1}=\frac{k_x}{gcd(k_x,k_y)}\\ k_{y_1}=\frac{k_y}{gcd(k_x,k_y)} \quad \end{cases} { kx1=gcd(kx,ky)kxky1=gcd(kx,ky)ky
于是有小球每次返回原点,经历两分量的路程及时间:
{ x n = k x 1 ∗ x ∗ n y n = k y 1 ∗ y ∗ m ( n = 0 , 1 , 2 , 3 , 4... ) \begin{cases}x_n=k_{x_1}*x*n\\y_n=k_{y_1}*y*m\quad\end{cases}(n=0,1,2,3,4...) {
xn=kx1∗x∗nyn