Python A 组 G 题,全排列的价值 (AC)

主要思路:

        f(n)=f(n−1)×n+ n×(n−1)/2×g(n−1)

---其中f为全排列的价值,易知f(1) = 0,作为初始条件得到f(n) = f(2) = f(1)*2 + 2*1/2*g(1) = 1 

---g(n-1):为(n-1)!,即n-1项的阶乘

---具体的思路推论,参考java大佬的思路:(395条消息) 第十三届蓝桥杯省赛Java A 组 F 题、Python A 组 G 题、Python B 组 G题——全排列的价值 (AC)_执 梗的博客-CSDN博客_蓝桥杯python和java

---以下是用python3.8,jupyter notebook实现的测试代码:

#全排列的价值 (AC)
#f(n)=f(n−1)×n+ n×(n−1)/2×g(n−1)
k = int(input())
g = []#记录阶乘
g.append(1)#g[0] = 1
mod=998244353
sum = 1
for i in range(1,k):
    sum *= i
    sum = sum % mod
    g.append(sum)
def f(n):
    if n == 1:
        return 0
    else:
        return f(n-1)*n%mod + int(n*(n-1)/2)%mod * int(g[n-1])%mod
print(f(k))

输入1

3

输出1

9

 样例:

输入2

2022

输出2

593300958

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值