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\)

  1. \(y\) 取到 \(x\) 或者相邻点的概率是 \(\frac{2}{n}\) ,取到后期望步数 \(0\)

  2. \(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\)

  1. 直接取到 \(y = x\)

    取到的概率是 \(\frac{1}{n}\) ,取到后期望步数是 \(0\)

  2. 取到 \(x-1\) 或者 \(x+1\)

    取到的概率是 \(\frac{2}{n}\) ,取到后的期望步数等同于 \(x\) 在两端时,为 \(\frac{n}{2}\)

  3. 取到其他点。

    取到的概率是 \(\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();
}
posted @ 2024-03-08 00:17  Epp1adeR  阅读(17)  评论(0)    收藏  举报