2023 hdu 第10场 1004 Do you Like Interactive Problem

文章探讨了一个关于整数范围内的随机查询问题,计算在知道某些条件下的期望询问次数。

Problem Description

现在有一个整数 xxx (1≤x≤n)(1 \le x \le n)(1xn),但你不知道 xxx

你可以进行以下的询问方式,选择一个随机的整数 yyy (1≤y≤n)(1 \le y \le n)(1yn) ,每次询问是相互独立的,询问后你会被告知 xxxyyy 满足 x<y,x>y,x=yx < y,x > y,x = yx<y,x>y,x=y 三种关系中的哪一种。

现在给出具体 nnn 后,求期望询问次数。

Input

第一行输入一个整数 TTT (1≤T≤100)(1 \le T \le 100)(1T100),表示测试组数。
接下来 TTT 行每行输入一个整数 nnn (1≤n≤109)(1 \le n \le 10^9)(1n109)

Output

输出模 998244353998244353998244353 的期望步数。

Solution

我们进行分类讨论。

首先当 n=1n=1n=1 时,我们需要特判期望步数为 000

而当 n>1n>1n>1 时,设期望为 EEE

xxx 在两端时,取到概率为 2n\frac{2}{n}n2

设期望为 E1E_1E1

  1. yyy 取到 xxx 或者相邻点的概率是 2n\frac{2}{n}n2 ,取到后期望步数 000

  2. yyy 取到其他的概率是 n−2n\frac{n-2}{n}nn2 ,期望步数依然是 E1E_1E1

那么我们能得到转移方程为 E1=n−2nE1+2n⋅0+1E_1 = \frac{n-2}{n} E_1 + \frac{2}{n}· 0 + 1E1=nn2E1+n20+1 ,解得期望步数为 E1=n2E_1 = \frac{n}{2}E1=2n

xxx 在中间时,取到概率为 n−2n\frac{n-2}{n}nn2

设期望为 E2E_2E2

  1. 直接取到 y=xy = xy=x

    取到的概率是 1n\frac{1}{n}n1 ,取到后期望步数是 000

  2. 取到 x−1x-1x1 或者 x+1x+1x+1

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

  3. 取到其他点。

    取到的概率是 n−3n\frac{n-3}{n}nn3 ,期望步数是 E2E_2E2

得到转移方程为 E2=1n⋅n+2n⋅n2+n−3nE2+1E_2 = \frac{1}{n}· n + \frac{2}{n}· \frac{n}{2} +\frac{n-3}{n} E_2 +1E2=n1n+n22n+nn3E2+1 ,解得期望步数为 E2=23nE_2 = \frac{2}{3} nE2=32n

E=2nE1+n−2nE2E = \frac{2}{n} E_1 + \frac{n-2}{n} E_2E=n2E1+nn2E2 ,解得 E=2n−13E = \frac{2n-1}{3}E=32n1

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();
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值