HDU-6838 Battle for Wosneth 题解

题目大意

A与B两人决斗,A先攻击,有$p%$的几率命中,命中时,B扣一点血,A加一点血,B后攻击,有$q%$的几率命中,命中时,A扣一点血。

A的血量可以看作无限,B的血为m,求A的血量变化的期望值。

解题思路

不会啊。。

这次直接爆零了,丢人。。

求期望的题目是真的不会。

之前也没做过这类题目。

有$p$%回一点血$q$%的概率扣一点血,所以血量每轮的变化量为$p\%-q\%$。

本来应该是有$\Large \frac{m}{p\%}$个回合,但是因为当B只有一点血的时候,A先攻击,所以期望为$p\%$,回合数需要减一。

所以答案为$\Large (\frac{m}{p\%}-1)(p\%-q\%)+q\%$。

因为p和q都是百分数,所以需要乘上逆元。

整理后得$\Large(\frac{m-p\times inv(100)}{p}(p-q)+q\times inv(100))$。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

const int mod = 998244353, maxn = 2e5 + 5;

ll qpow(ll a, ll b) {
ll ans = 1;
a %= mod;
while (b) {
if (b & 1) ans = (ans * a % mod) % mod;
a = (a * a) % mod, b >>= 1;
}
return ans;
}

int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t; cin >> t;
while (t--) {
ll m, p, q;
cin >> m >> p >> q;
ll inv = qpow(100, mod - 2);
ll ans = (p * inv) % mod;
ll res = (((m - ans) * (p - q) * inv % mod) % mod * qpow(p, mod - 2)) % mod;
ans = ((ans + (res) % mod) % mod + mod) % mod;
cout << ans % mod << endl;
}
return 0;
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2015-2021 sakurakarma
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信