2023陕西ICPC邀请赛a题思路

86b9eff37dc649ed8c7e2e2179208e1e.jpg

题目如上,大意是输入n,随机一个n的全排列,就是包含1~n 所有数的一个排列,接着Alice先手,操作是如果排列第一个为p1,则排列中前p1个数可以按照你想的任意排列,但后面的数不能动。输的条件是操作了两次相同的p1,就是p1相同的排列不能处理两次,现在问Bob能赢多少次。

理解题意后会发现,因为p1有多大就能操作前多少个数,如果在前p1个数有少于p1的数x,那么将x放在第一位,p1放在第p1个位置,那么后面的人就不能在操作到这个p1,因为x小于p1。

由此,我们可以得出Bob赢的条件,既后手必胜的条件,在前p1个数内的数都要大于p1。于是便能得出答案。

p1是第一位的数,前p1个去掉p1后是p1-1个数,比p1大的数是n-p1个数,如果要后手赢,那么第二个数到第p1个数的排列数量是在n-p1中取p1-1个数进行有顺序的排列,然后,由于前p1个数已经算出,后面的排列数量就是(n-p1)!

因为p1可以取1~n,所以答案就是68284a7113e6494980c64eaebeaecf46.jpg

 python暴力代码如下,这个代码能过我的所有样例

def factorial(num1,num2):a=1#for循环遍历for i in range(0,num1):a*=(num2-i)if num1 == 0:a = 1return a
n = int(input())
ans = 0
p = 998244353
for j in range(1,n+1):if n-j >= j-1:a = factorial(n-j,n-j)b = factorial(j-1,n-j)ans+=a*b
print(ans%p)

至于c的代码,等我晚点码出来₍˄·͈༝·͈˄*₎◞ ̑̑

(萌新个人理解,大佬们发现问题请指出(●'◡'●))


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部