【蓝桥杯】 三行代码解决 “全排列的价值”(2022省赛pythonA组)

这篇博客介绍了如何使用Python解决全排列的价值问题,通过递推公式计算每种排列顺序对的数量。作者详细解释了从1到n的全排列如何通过插入n+1形成1到n+1的全排列,并分析了插入新元素时价值的变化,展示了一段利用数学阶乘和递推关系计算排列价值的代码。博客最后提供了样例输入和输出,以及计算过程的实例。
摘要由CSDN通过智能技术生成

三行代码解决 “全排列的价值”(2022省赛pythonA组)

置顶代码:

from math import factorial
n = int(input())
print(factorial(n) *(n-1)*n//4 % 998244353)

一、试题 G: 全排列的价值

在这里插入图片描述

【问题描述】

对于一个排列 A = ( a 1 , a 2 , ⋅ ⋅ ⋅ , a n ) A = (a_1, a_2, · · · , a_n) A=(a1,a2,,an),定义价值 c i c_i ci a 1 a_1 a1 a i − 1 a_i−1 ai1 中小于 a i a_i ai 的数的个数,即 c i = ∣ { a j ∣ j < i , a j < a i } ∣ c_i = |\{a_j| j < i, a_j < a_i \}| ci={ajj<i,aj<ai}。定义 A 的价值为 ∑ i = 1 n c i ∑^n_{i=1} c_i i=1nci。给定 n n n,求 1 至 n n n 的全排列中所有排列的价值之和。

【输入格式】

输入一行包含一个整数 n 。

【输出格式】

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

【样例】

  • 【样例输入 1】

    3

  • 【样例输出 1】

    9

  • 【样例输入 2】

    2022

  • 【样例输出 2】

    593300958

【样例说明】

1 至 3 构成的所有排列的价值如下:

  • (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 = 9。

二、Python 代码

from math import factorial
n = int(input())
print(factorial(n) *(n-1)*n//4 % 998244353)

三、题解

本质上是利用递推公式求每种排列的顺序对(相对逆序对而言)的数量。
1 ~ n构成的全排列,可以通过插入n+1来构成1 ~ n+1 的全排列。而插入一个比原先排列中的数都大的数时,增加顺序对的个数只和插入位置相关。

例如:
1、2构成的全排列可以通过插入3,构成1、2、3构成的全排列。

(1,2): = 1

  • (3,1,2)= 1+0 = 1
  • (1,3,2)= 1+1 = 2
  • (1,2,3)= 1+2 = 3

(2,1):= 0

  • (3,2,1)= 0+0 = 0
  • (2,3,1)= 0+1 = 1
  • (2,1,3)= 0+2 = 2

P n P^n Pn :表示 1 ~ n 全排列的价值
N ( n ) N(n) N(n):表示 1 ~ n 全排列的数量

同理 1 ~ n-1 的全排列中插入 n,每个排列有n个插入位置(0 ~ n-1),每个插入位置带来的价值和下标相同。计算 1 ~ n全排列的价值时,其构成主要是两部分:原有排列的价值: P n − 1 P^{n-1} Pn1产生的、新插入n+1后新产生的价值。
P n − 1 P^{n-1} Pn1被重复计算n遍,原有价值 = P n − 1 × n P^{n-1} \times n Pn1×n
对于1 ~ n-1 的全排列中每个排列,插入n后会产生 ∑ i = 0 n − 1 i \sum_{i=0}^{n-1}i i=0n1i的价值,新产生的价值 = N ( n − 1 ) × ∑ i = 0 n − 1 i = ( n − 1 ) ! × ( n ( n − 1 ) 2 ) = n ! × ( n − 1 ) / 2 N(n-1) \times\sum_{i=0}^{n-1}i = (n-1)!\times(\frac{n(n-1)}{2})=n!\times(n-1)/2 N(n1)×i=0n1i=(n1)!×(2n(n1))=n!×(n1)/2

递推得到 P n = n ! × ( n − 1 ) n / 4 P^n = n!\times(n-1)n/4 Pn=n!×(n1)n/4

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BkbK-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值