(第一篇博,写这个是因为,感觉自己写半天代码,看了一眼别人提交,都是直接三循环暴力硬算,但是我为了练数学优化好半天,很胃疼,所以发出来给大家看个乐子)
并不难懂,就是单纯怕超时优化了一下(哈希和gcd那块,注释了),同时看到别人提交的代码少有gcd的,毕竟是规划到了数学题单里嘛,我就发一下我这个有gcd的做法,方便刚学、想找一星难度题试试水结果无从下手的人理解。
#include <iostream>
#include <vector>
#include <unordered_map>
#include <numeric>
using namespace std;
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main() {
int n, k;
cin >> n >> k;
vector<int> nums(n);
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
int totalWays = n * n * n; // 总的选择组合数
int validWays = 0; // 符合条件的组合数
// 使用哈希表存储前两个数的和及其出现的次数
unordered_map<int, int> sumCount;
// 计算所有两个数的和
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
int sum = nums[i] + nums[j];
sumCount[sum]++;
}
}
// 查找第三个数
for (int k1 = 0; k1 < n; ++k1) {
int requiredSum = k - nums[k1];
if (sumCount.find(requiredSum) != sumCount.end()) {
validWays += sumCount[requiredSum];
}
}
// 计算概率
int a = validWays;
int b = totalWays;
// 约分
int s=gcd(a, b);
a/=s;
b/=s;
// 输出结果
cout << a << "/" << b << endl;
return 0;
}