P10867 [HBCPC2024] Points on the Number Axis A
题目描述
Alice 正在数轴上玩一个单人游戏。
数轴上有 nnn 个点。每次,玩家选择两个点。这两个点将被移除,并添加它们的中点。当数轴上只剩下一个点时,游戏结束。形式上,如果选择的两个点是 xix_ixi 和 xjx_jxj,那么在操作后将添加 xi+xj2\dfrac{x_i+x_j}{2}2xi+xj。
为了愉快地进行这个游戏,Alice 总是随机选择两个点。
现在 Alice 有一个问题:最后一个点的期望位置在哪里。
可以证明,答案可以表示成 pq\dfrac{p}{q}qp 的形式,你只需要输出 p⋅q−1 mod 998 244 353p\cdot q^{-1} \bmod 998\,244\,353p⋅q−1mod998244353 的值。
输入格式
第一行包含一个整数 nnn (1≤n≤1061 \le n \le 10^61≤n≤106)。
第二行包含 nnn 个整数 xix_ixi (0≤x1≤⋯≤xn<998 244 3530 \le x_1 \le \dots \le x_n < 998\,244\,3530≤x1≤⋯≤xn<998244353),表示第 iii 个点的位置。
注意,两个点可能在同一位置。
输出格式
输出一个整数,即答案对 998 244 353998\,244\,353998244353 取模后的结果。
输入输出样例 #1
输入 #1
3
1 2 4
输出 #1
332748120
说明/提示
(由 ChatGPT 4o 翻译)
C++实现
#include <bits/stdc++.h>
#define PII pair <int, int>
#define int long long
#define DB double
using namespace std;
const int N = 1e6 + 10, MOD = 998244353;
int n, x, sum;
int kuaisu(int x, int y)
{
int ret = 1;
while(y)
{
if(y & 1)
ret = ret * x % MOD;
x = x * x % MOD;
y >>= 1;
}
return ret;
}
signed main()
{
scanf("%lld", &n);
for(int i = 1; i <= n; i ++ )
{
scanf("%lld", &x);
sum = (x + sum) % MOD;
}
printf("%lld\n", sum * kuaisu(n, MOD - 2) % MOD);
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥题 P10867 HBCPC2024 Points on the Number Axis A&spm=1001.2101.3001.5002&articleId=163811484&d=1&t=3&u=b7bb57865b2f4f9788a2b8edff9ce70f)
190

被折叠的 条评论
为什么被折叠?



