题目 2687: 蓝桥杯2022年第十三届省赛真题-全排列的价值

文章介绍了如何计算给定整数n下,1到n的全排列中所有排列价值之和,利用特定规律n*(n-1)/2和模运算998244353求解,适用于n≤10^6的范围。

题目 2687: 

蓝桥杯2022年第十三届省赛真题-全排列的价值

时间限制: 3s 内存限制: 576MB 提交: 2999 解决: 577

题目描述

对于一个排列 A = (a1, a2, · · · , an),定义价值 ci 为 a1 至 ai−1 中小于 ai 的数的个数,即 bi = |{aj | j < i, aj < ai}|。定义 A 的价值为

蓝桥杯2022年第十三届省赛真题全排列的价值

给定 n,求 1 至 n 的全排列中所有排列的价值之和。

输入格式

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

输出格式

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

样例输入

复制

3

样例输出

复制

9

提示

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。 

对于 40% 的评测用例,n ≤ 20 ;

对于 70% 的评测用例,n ≤ 5000 ;

对于所有评测用例,2 ≤ n ≤ 106 。 

解题思路

        对于每一对恰好前后颠倒的排列顺序(1 2 3 4 和 4 3 2 1),其价值和为n*(n-1)/2,可以自己算一下就知道了。一共有n!个排列顺序,也就是n!/2对排列,

所以结果为n*n(n-1)/2*n!%998244353

#include<iostream>
using namespace std;

#define mod 998244353LL
typedef long long ll;

int main(){
    ll n,count=1;
    cin>>n;
    count=n*(n-1)/2;
    count%=mod;
    for(int i=3;i<=n;i++){
        ans*=i;
        ans%=mod;
    }
    cout<<ans;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值