2023 hdu 第10场 1004 Do you Like Interactive Problem
Problem Description
现在有一个整数 \(x\) \((1 \le x \le n)\),但你不知道 \(x\) 。
你可以进行以下的询问方式,选择一个随机的整数 \(y\) \((1 \le y \le n)\) ,每次询问是相互独立的,询问后你会被告知 \(x\) 和 \(y\) 满足 \(x < y,x > y,x = y\) 三种关系中的哪一种。
现在给出具体 \(n\) 后,求期望询问次数。
Input
第一行输入一个整数 \(T\) \((1 \le T \le 100)\),表示测试组数。
接下来 \(T\) 行每行输入一个整数 \(n\) \((1 \le n \le 10^9)\)。
Output
输出模 \(998244353\) 的期望步数。
Solution
我们进行分类讨论。
首先当 \(n=1\) 时,我们需要特判期望步数为 \(0\) 。
而当 \(n>1\) 时,设期望为 \(E\) 。
① \(x\) 在两端时,取到概率为 \(\frac{2}{n}\) 。
设期望为 \(E_1\) 。
-
\(y\) 取到 \(x\) 或者相邻点的概率是 \(\frac{2}{n}\) ,取到后期望步数 \(0\) 。
-
\(y\) 取到其他的概率是 \(\frac{n-2}{n}\) ,期望步数依然是 \(E_1\) 。
那么我们能得到转移方程为 \(E_1 = \frac{n-2}{n} E_1 + \frac{2}{n}· 0 + 1\) ,解得期望步数为 \(E_1 = \frac{n}{2}\) 。
② \(x\) 在中间时,取到概率为 \(\frac{n-2}{n}\) 。
设期望为 \(E_2\) 。
-
直接取到 \(y = x\) 。
取到的概率是 \(\frac{1}{n}\) ,取到后期望步数是 \(0\) 。
-
取到 \(x-1\) 或者 \(x+1\) 。
取到的概率是 \(\frac{2}{n}\) ,取到后的期望步数等同于 \(x\) 在两端时,为 \(\frac{n}{2}\) 。
-
取到其他点。
取到的概率是 \(\frac{n-3}{n}\) ,期望步数是 \(E_2\) 。
得到转移方程为 \(E_2 = \frac{1}{n}· n + \frac{2}{n}· \frac{n}{2} +\frac{n-3}{n} E_2 +1\) ,解得期望步数为 \(E_2 = \frac{2}{3} n\) 。
故 \(E = \frac{2}{n} E_1 + \frac{n-2}{n} E_2\) ,解得 \(E = \frac{2n-1}{3}\) 。
Code
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long ;
constexpr int mod = 998244353;
ll qmi(ll a, ll k) {
ll res = 1 % mod, t = a % mod;
while (k) {
if (k & 1)res = res * t % mod;
t = t * t % mod;
k >>= 1;
}
return res;
}
void solve() {
ll n;
cin >> n;
if (n == 1)cout << 0 << endl;
else cout << (2 * n - 1) % mod*qmi(3, mod - 2) % mod << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) solve();
}

浙公网安备 33010602011771号