列表

详情


NC229190. 武义寺

描述

从前有个寺庙,名为武义寺。庙里有个老和尚和小和尚。老和尚叫扶弱给,小和尚叫扶弱呱。老和尚说“从前有个寺庙,名为武义寺。庙里有个老和尚和小和尚。老和尚叫扶弱给,小和尚叫扶弱呱……”
有一天,扶弱给在潜心研究排列。他在脑中随机一个排列的时候,脑海里冒出了这样一个问题:
对于一个排列 ,记 等于最小的 满足 ,如不存在则
可是 的期望值是多少呢?显然,扶弱给没学过编程,需要你来帮帮他。

本场比赛大样例 :https://uploadfiles.nowcoder.com/files/20211016/%E5%A4%A7%E6%A0%B7%E4%BE%8B.zip

输入描述

输入一个数 

输出描述

输出  的期望值,答案对  取模。

示例1

输入:

2

输出:

499122179

说明:

对于排列 {p=[1,2]}\text{val}(p)=3;对于排列 {p=[2,1]}\text{val}(p)=2。因此期望值为 \frac{5}{2}

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 174ms, 内存消耗: 8252K, 提交时间: 2023-04-08 20:57:58

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int mod = 998244353;

int n;
ll fac[1000010];

ll qpow(ll x, ll y) {
	ll ans = 1;
	while (y) {
		if (y & 1) {
			ans = ans * x % mod;
		}
		y >>= 1;
		x = x * x % mod;
	}
	return ans % mod;
}

int main() {
	scanf("%d", &n);
	fac[0] = 1;
	for (int i = 1; i <= n; ++ i) {
		fac[i] = fac[i - 1] * i % mod;
	}
	ll ans = 0;
	for (int k = 1; k <= n; ++ k) {
		ans = ans + ((n + 1 - k) * fac[k]) % mod * ((qpow(k + 1, n - k) - qpow(k, n - k)) % mod + mod) % mod;
		ans %= mod;
	}
	ans += n + 1;
	ll res = ans * qpow(fac[n], mod - 2) % mod;
	printf("%lld\n", res);
	return 0;
}

C++ 解法, 执行用时: 173ms, 内存消耗: 456K, 提交时间: 2021-10-18 20:10:37

#include<iostream>
using namespace std;
const int P=998244353;
int n,m,f=1;
inline int ksm(int a,int b){
    int res=1;
    while(b){
        if(b&1)  res=1ll*res*a%P;
        a=1ll*a*a%P;b>>=1;
    }return res;
}
inline int MOD(int x) {return x-(x>=P)*P;}
int main()
{
    cin>>n;m=n+1;
    for(int k=1;;f=1ll*f*(++k)%P){
        m=MOD(m+1ll*MOD(ksm(k+1,n-k)-ksm(k,n-k)+P)*f%P*(n-k+1)%P);
        if(k==n)  break;
    }cout<<1ll*m*ksm(f,P-2)%P;return 0;
}

上一题