P12369 [蓝桥杯 2022 省 Python B] 全排列的价值

题目描述

对于一个排列 A=(a1,a2,⋯ ,an)A=(a_1,a_2,\cdots,a_n)A=(a1,a2,,an),定义价值 cic_icia1a_1a1ai−1a_{i-1}ai1 中小于 aia_iai 的数的个数,即 ci=∣{aj∣j<i,aj<ai}∣c_i=|\{a_j|j<i,a_j<a_i\}|ci={ajj<i,aj<ai}。定义 AAA 的价值为 ∑i=1nci\displaystyle \sum_{i=1}^{n}c_ii=1nci

给定 nnn,求 111nnn 的全排列中所有排列的价值之和。

输入格式

输入一行包含一个整数 nnn

输出格式

输出一行包含一个整数表示答案,由于所有排列的价值之和可能很大,请输出这个数除以 998244353998244353998244353 的余数。

输入输出样例 #1

输入 #1

3

输出 #1

9

输入输出样例 #2

输入 #2

2022

输出 #2

593300958

说明/提示

样例说明

111333 构成的所有排列的价值如下:

(1,2,3):0+1+2=3(1,3,2):0+1+1=2(2,1,3):0+0+2=2(2,3,1):0+1+0=1(3,1,2):0+0+1=1(3,2,1):0+0+0=0\begin{aligned}& (1,2,3): 0+1+2=3 \\& (1,3,2): 0+1+1=2 \\& (2,1,3): 0+0+2=2 \\& (2,3,1): 0+1+0=1 \\& (3,1,2): 0+0+1=1 \\& (3,2,1): 0+0+0=0\end{aligned}(1,2,3):0+1+2=3(1,3,2):0+1+1=2(2,1,3):0+0+2=2(2,3,1):0+1+0=1(3,1,2):0+0+1=1(3,2,1):0+0+0=0

故总和为 3+2+2+1+1=93+2+2+1+1=93+2+2+1+1=9

评测用例规模与约定

  • 对于 40%40\%40% 的评测用例,n≤20n \leq 20n20
  • 对于 70%70\%70% 的评测用例,n≤5000n \leq 5000n5000
  • 对于所有评测用例,2≤n≤1062 \leq n \leq 10^62n106

C++实现

#include<bits/stdc++.h>
#define int long long
#define _ 0
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
int n;
int fac[N];//阶乘 
int qp(int a, int b, int p)//快速幂 
{
	int res = 1;
	while(b)
	{
		if(b & 1) res = res * a % p;
		a = a * a % p;
		b >>= 1;
	}
	return res;
}
void initfac()//预处理阶乘 
{
	fac[0] = 1;
	for(int i = 1; i < N; i ++)
		fac[i] = fac[i - 1] * i % mod;
}
signed main()
{
	initfac();
	cin >> n;
	cout << fac[n] * n % mod * (n - 1) % mod * qp(4ll, mod - 2, mod) % mod;
	return (0^_^0);
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐