蓝桥杯 2024 国 B【选数概率】(AC)
题目描述
一个数组中有 a a a 个 1 1 1, b b b 个 2 2 2, c c c 个 3 3 3。设 P i , j P_{i,j} Pi,j 表示在数组中随机选取两个数,其中一个数为 i i i,另一个数为 j j j 的概率。比如 P 1 , 2 = a b C ( a + b + c , 2 ) P_{1,2} = \dfrac{ab}{C(a+b+c,2)} P1,2=C(a+b+c,2)ab,其中 C ( N , M ) C(N, M) C(N,M) 为组合数,表示从 N N N 个不同元素中任取 M M M 个的方案数。
当 a = ? , b = ? , c = ? a=\text{?},b=\text{?},c=\text{?} a=?,b=?,c=? 时,满足 P 1 , 2 = 517 2091 , P 2 , 3 = 2632 10455 , P 1 , 3 = 308 2091 P_{1,2}=\dfrac{517}{2091},P_{2,3}=\dfrac{2632}{10455},P_{1,3}=\dfrac{308}{2091} P1,2=2091517,P2,3=104552632,P1,3=2091308,且 a + b + c a + b + c a+b+c 最小。保证 a + b + c a + b + c a+b+c 最小的解是唯一的。
你需要提交一个格式为
a
,
b
,
c
a,b,c
a,b,c 的字符串。例如假设你计算的结果是
a
=
12
,
b
=
34
,
c
=
56
a =12, b = 34, c = 56
a=12,b=34,c=56,那么你需要提交的字符串是 12,34,56
。
输入格式
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
输出格式
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
解题思路
已知 P 1 , 2 = a b C ( a + b + c , 2 ) P_{1,2} = \dfrac {ab}{C(a + b + c, 2)} P1,2=C(a+b+c,2)ab,那么 P 1 , 3 = a c C ( a + b + c , 2 ) P_{1,3} = \dfrac {ac}{C(a + b + c, 2)} P1,3=C(a+b+c,2)ac, P 2 , 3 = b c C ( a + b + c , 2 ) P_{2,3} = \dfrac {bc}{C(a + b + c, 2)} P2,3=C(a+b+c,2)bc。
我们知道 C n m = n ! m ! ⋅ ( n − m ) ! C_n^m = \dfrac {n!}{m! \cdot (n-m)!} Cnm=m!⋅(n−m)!n!,那么 C n 2 = n ! 2 ! ⋅ ( n − 2 ) ! = n × ( n − 1 ) 2 C_n^2=\dfrac {n!}{2! \cdot (n-2)!}=\dfrac{n \times (n - 1)}{2} Cn2=2!⋅(n−2)!n!=2n×(n−1)。
那么接下来,我们只需要去枚举 a , b , c a, b, c a,b,c 即可得出答案。
AC_Code
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int calc(int x)
{
return x * (x - 1) / 2;
}
bool equal(int x1, int y1, int x2, int y2)
{
int t = x1 / x2;
if (x1 % x2)
return false;
return t * y2 == y1;
}
int main()
{
for (int i = 1; i <= 200; ++ i )
for (int j = 1; j <= 200; ++ j )
for (int k = 1; k <= 200; ++ k )
if (equal(i * j, calc(i + j + k), 517, 2091))
if (equal(j * k, calc(i + j + k), 2632, 10455))
if (equal(i * k, calc(i + j + k), 308, 2091))
cout << i << ',' << j << ',' << k << endl;
return 0;
}