在做题目之前,我们需要知道概率是什么。
概率,亦称“或然率”,它是反映随机事件出现的可能性大小。
在讨论一个事件的概率的时候,我们需要搞清楚概率的讨论范围,比如,掷硬币的概率就不考虑天气等其他因素。
为了简化叙述,我们采用术语:
我们用掷骰子来举例:
P ( ⋃ i = 1 n A i ) = ( − 1 ) 0 ∑ i = 1 n P ( A i ) + ( − 1 ) 1 ∑ 0 < i < j ≤ n P ( A i A j ) + . . . + ( − 1 ) n − 1 P ( A 1 A 2 . . . A n ) P(\bigcup_{i=1}^{n}A_{i})=(-1)^{0}\sum_{i=1}^{n}P(A_{i})+(-1)^{1}\sum_{0P(⋃i=1nAi)=(−1)0∑i=1nP(Ai)+(−1)1∑0<i<j≤nP(AiAj)+...+(−1)n−1P(A1A2...An)指的是朝上的面为:{ 1 1 1}。
样本空间指的是朝上的面为:{ 1 , 2 , 3 , 4 , 5 , 6 1,2,3,4,5,6 1,2,3,4,5,6}。
随机事件指的是朝上的面为:{ 1 , 2 1,2 1,2}。
这里要注意:一个样本点一定是一个随机事件,但一个随机事件不一定是一个样本点。
其实,概率可以理解为一个集合,它可以满足:
非负性,规范性,可数可加性,以及容斥原理。
容斥原理的公式是:
P ( ⋃ i = 1 n A i ) = ( − 1 ) 0 ∑ i = 1 n P ( A i ) + ( − 1 ) 1 ∑ 0 < i < j ≤ n P ( A i A j ) + . . . + ( − 1 ) n − 1 P ( A 1 A 2 . . . A n ) P(\bigcup_{i=1}^{n}A_{i})=(-1)^{0}\sum_{i=1}^{n}P(A_{i})+(-1)^{1}\sum_{0P(⋃i=1nAi)=(−1)0∑i=1nP(Ai)+(−1)1∑0<i<j≤nP(AiAj)+...+(−1)n−1P(A1A2...An)
我们还要学会计算期望值:
期望值指的的是随机变量的值乘以其概率的总和。
话不多说,我们直接看例题。
题目链接
下面附上代码
#include
using namespace std;
#define endl '\n'
#define int long long
#define For(i, a, b) for (int i = a; i <= b; i++)
typedef pair PII;
const int N = 1e6;
int n, a[N], flag, ans, ans1;
int gcd(int a, int b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
int ee()
{
for (int i = 1; i <= n; i++)
{
ans += abs(a[i]);
}
for (int i = 1; i <= n; i++)
{
if (a[i] > 0)
ans1 += 1;
}
return ans;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--)
{
flag = true, ans = 0, ans1 = 0;
memset(a, 0, sizeof a);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if (a[i] >= 0)
{
flag = false;
}
}
if (flag)
{
cout << "inf\n";
continue;
}
ee();
int flag1 = gcd(ans, ans1);
cout << ans / flag1 << "/" << ans1 / flag1 << endl;
}
return 0;
}
题目链接
这道题大家可以自己思考,我也会适当添加注释的。
#include
using namespace std;
#define endl '\n'
#define int long long
#define For(i, a, b) for (int i = a; i <= b; i++)
typedef pair PII;
const int N = 1e4;
const int P = 1e9 + 7;
int n, a[N], dp[N];
/*
状态设计:dp[i]表示从第 i 位置开始,按照游戏规则,最终可以得到的期望黄金数量
答案: dp[1]
初值:dp[n] = a[n];
转移:dp[i] - (dp[i + 1] + dp[i + 2] + ...... + dp[min(n, 1 + 6)]) / {min(n, j + 6) - j}, j = 1, ......, n - 1
)
*/
int inv(int x) {
int res = 1;
int n = P - 2;
while (n) {
if (n & 1)
res = res * x % P;
x = x * x % P;
n >>= 1;
}
return res;
}
void solve()
{
memset(dp, 0, sizeof dp);
cin >> n;
For(i, 1, n)
{
cin >> a[i];
}
dp[n] = a[n];
for (int i = n - 1; i >= 1;i--){
For(j, i + 1, min(n, i + 6)){
dp[i] = (dp[i] + dp[j]) % P;
}
dp[i] = dp[i] * inv(min(n, i + 6) - i) % P;
dp[i] = (dp[i] + a[i]) % P;
}
cout << dp[1] % P << endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
今天的文章就到这里啦,三连必回qwq!