P10423 题解

· · 题解

题目分析

  1. 试题 A:握手问题

    在一次 50 个人的会议中大家进行了握手交流,其中有 7 个没有相互握手,我们需要求出这些人之间一共进行了多少次握手。

  2. 试题 B:小球反弹

    有一个小球在一个长方形内部左上角顶点开始运动,我们需要求出从小球出发到其第一次回到左上角顶点这段时间里,小球运动的路程为多少单位长度。

思路

  1. 试题 A:握手问题

    50 个人,其中 7 个人没有互相握手,所以其他的 43 人都是与 42 个人握了手。

    因为 AB 握手的同时也意味着 BA 握手了,算作一次握手。所以要算这 43 人的握手次数,相当于从 43 人中选出 2 人进行组合。即 C_{43}^2

    需要注意的是,那 7 人不是没有跟任何人握手,而是 7 人之间没有握手,每个人都与其他的 43 人握了手。所以这 7 人总共的握手次数为 7 \times 43 = 301 次。

    所以答案为 C_{43}^2 + 301 = \dfrac{43 \times 42}{2 \times 1} + 301 = 1204 次。

  2. 试题 B:小球反弹

    长方形的长 x343720,宽 y233333。小球分解到长宽两个方向上的速率之比为 dx : dy = 15 : 17

    因为水平方向来回的路程为 2x,竖直方向为 2y

    所以小球在左上角时,水平走了 2x \times k_1 个单位长度,竖直走了 2y \times k_2 个单位长度。假设小球运动回左上角的时间为 a

    由题得 a \times dx0 除以 2x 的余数相同,a \times dy0 除以 2y 的余数相同。

    也就是说

    a \times dx = k_1 \times 2x\\ a \times dy = k_2 \times 2y \end{cases}

    并且 k_1,k_2 都是整数。

    \therefore a = \dfrac{k_1 \times 2x}{dx} = \dfrac{k_2 \times 2y}{dy} \therefore \dfrac{k_1 \times 2x}{dx} \times dx \times dy = \dfrac{k_2 \times 2y}{dy} \times dx \times dy \therefore k_1 \times 2x \times dy = k_2 \times 2y \times dx \therefore\dfrac{k_1}{k_2} = \dfrac{2y \times dx}{2x \times dy} \therefore\dfrac{k_1}{k_2} = \dfrac{y \times dx}{x \times dy} \therefore\dfrac{k_1}{k_2} = \dfrac{15y}{17x}

    k_1,k_2 最小时 2x \times k_12y \times k_2 分别为出发后第一次回到左上角时水平方向和竖直方向走的路程。

    此时求出 15y17x 的最大公因数 b3305。然后 15y17x 分别除以 b,就能得到 k_1 = \dfrac{15y}{b}=\dfrac{15y}{3305}=1059,k_2=\dfrac{17x}{b}=\dfrac{17x}{3305}=1768

    k_1 = 1059,k_2=1768 代入 a =\dfrac{k_1 \times 2x}{dx} = \dfrac{k_2 \times 2y}{dy},得出 a\times dx=7.27998960 \times 10^8,a \times dy = 8.25065488 \times 10^8

    那么就能算出总路程为 \sqrt{(a \times dx)^2 + (a \times dy)^2}=1.10032519977 \times 10^9

C++ 代码实现

#include<bits/stdc++.h>
using namespace std;

int main() 
{
    string ans [] = 
    {
        "1204",
        "1100325199.77", 
    };
    char T;
    cin >> T;
    cout << ans[T - 'A'] << endl;
    return 0;
}