题解:P12369 [蓝桥杯 2022 省 Python B] 全排列的价值
zhanghy123 · · 题解
P12369 [蓝桥杯 2022 省 Python B] 全排列的价值 题解
思路
分享一种不用逆元的做法。
考虑线性递推。设答案为
如图,将
(挺显然的说是…)
每次不同的插入方法都视为一种答案,
时间复杂度
C++
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e6+5,mod=998244353;
ll n,ans[N],jc[N]={1,1};
int main()
{
cin>>n;
ans[2]=1;
for(int i=1; i<=N; i++)
jc[i]=jc[i-1]*i%mod;//阶乘预处理
for(int i=3; i<=n; i++)
ans[i]=(i*1ll*ans[i-1]%mod+i*1ll*(i-1)/2ll%mod*1ll*jc[i-1]%mod)%mod;
//记住在常数后面加 ll 防止转 int 炸掉
//由于 i*(i-1) 一定为偶数,所以可以直接 /2 而不用考虑逆元
cout<<ans[n]%mod;
return 0;
}
Python
mod = 998244353
N = 1000005
n = int(input())
ans = [0] * N
ans[2] = 1
jc = [1] * N
for i in range(1, N):
jc[i] = (jc[i-1] * i) % mod
for i in range(3, n + 1):
t1 = (i * ans[i-1]) % mod
t2 = ((i * (i - 1) // 2) % mod) * jc[i-1] % mod
ans[i] = (t1 + t2) % mod
print(ans[n] % mod)
upd on 2025/5/5 18:30:添加了 Python 代码。
upd on 2025/6/7 22:05:修改了凌乱冗余的语言描述,增强可读性。