superLouis
2024-12-12 11:43:16
终于遇到一个数学题啦!
每组数据给你一个
首先要确定的是,这是一道概率题,跟
要确定
对于一个凸
总结一下以上的分析,我们可以得到如下的结论:
任意的
k 条边的长度之和必须大于第k+1 条边的长度。
我们再稍作转化,就可以得到如下的结论
对于凸
k+1 边形,其中的任意一条边的长度都必须小于周长的一半。
确定好条件之后,我们需要去考虑如何计算概率了。考虑到正向计算很难,所以我们可以方向考虑,即考虑围不成凸
由于最多只有一条边大于等于周长的一半,不妨设这条最长的边在最左侧,则剩下的
对于每一条小于周长的一半的直线段,其全部在右二分之一的概率为
而由于一共有
结合上面的分析,可以得到最终的概率为
我提出一些注意事项:
0/1
,约分时容易 Runtime Error
。long long
,因为 #include <bits/stdc++.h>
using namespace std;
#define int long long
int t, n, k, cnt;
int pow(int a, int b) {
int ans = 1;
while (b--) ans *= a;
return ans;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> t;
while (t--) {
cin >> n >> k; cnt++;
if (k <= 1) { cout << "Case #" << cnt << ": 0/1\n"; continue; }
int a = pow(2, k) - k - 1, b = pow(2, k);
int gcd = __gcd(a, b);
cout << "Case #" << cnt << ": " << a / gcd << "/" << b / gcd << "\n";
}
return 0;
}
AC 记录