列表

详情


NC21479. 左方之地

描述

左方之地是全宇宙最帅的男人,由于有人嫉妒他的帅气,他决定出一道题考一考这些嫉妒他帅气的人。

左方之地现在手上有 n 件不同的灵装,第 i 件灵装有一个帅气值 ai ,现在他将灵装随机摆成一个排列,并将这个排列映射到一棵二叉树上,这棵二叉树的中序遍历是原排列,且每一个节点上的灵装编号都要小于其子树中的所有点的灵装编号。可以证明对于一个排列,这样的二叉树的形态是唯一的。

这棵树会产生一个总的帅气值等价于树上每个节点的灵装的帅气值乘上该节点的深度(根节点的深度为 1)之和,左方之地想让你求出期望能获得的总帅气值在膜 998244353 意义下的结果是多少

输入描述

第一行一个数 n。
接下来 n 行,第 i 行一个整数 ai

输出描述

输出共一个数,表示答案。

示例1

输入:

3
1
1
1

输出:

665496241

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 82ms, 内存消耗: 1532K, 提交时间: 2019-09-13 15:12:28

#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define per(i, a, b) for (int i = a; i >= b; i--)
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
const int mod = 998244353;

int n, a[maxn], suf[maxn], inv[maxn], ans;

int main() {
    cin >> n;
    rep(i, 1, n) cin >> a[i];
    inv[1] = 1;
    rep(i, 2, n + 1) inv[i] = mod - (ll)mod / i * inv[mod % i] % mod;
    per(i, n, 1) suf[i] = ((ll)a[i] + suf[i + 1]) % mod;
    rep(i, 1, n) ans = ((ll)ans + a[i] + (ll)inv[i + 1] * 2 * suf[i + 1] % mod) % mod;
    return !printf("%d\n", ans);
}

C++11(clang++ 3.9) 解法, 执行用时: 39ms, 内存消耗: 1256K, 提交时间: 2020-03-18 17:17:56

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll p=998244353;
ll n,sum,ans,a[500010];
ll ksm(ll x,ll y){
	ll xlh=1;
	while(y){
		if(y&1)xlh=xlh*x%p;
		x=x*x%p;
		y/=2;
	}
	return xlh;
}
int main(){
	ll i;
	scanf("%lld",&n);
	for(i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		ans=(ans+(1+sum)*a[i])%p;
		sum=(sum+2*ksm(i+1,p-2)%p)%p;
	}
	printf("%lld",ans);
}

上一题