Atcoder Beginner Contest 226 F - Score of Permutations

Atcoder Beginner Contest 226 F - Score of Permutations
在这里插入图片描述
题目大意
给定一个全排列 P P P = { p 1.. n } \{ p_{1..n}\} {p1..n}
现在,有 n n n 个人,标号为 1 , 2 , 3 , 4 , . . . , n 1,2,3,4,...,n 1,2,3,4,...,n ,每个人手上有一个球。
进行诺干轮操作:
把手上的球给编号为 p i p_i pi 的人。
直到每个人手上拿到初始时刻所持有的球。
对于长度为 n n n 的全排列 P P P 定义 S ( P ) S(P) S(P) 为操作的轮数。
∑ S ( P ) k \sum S(P)^k S(P)k 其中 P P P 是长度为 n n n 的所有可能的全排列
题解
首先我们定义全错位排列,指的是一个集合X={ p a 1 , p a 2 . . p a n p_{a_1},p_{a_2}..p_{a_n} pa1,pa2..pan }:经过 n n n 次操作,集合中的所有人(也就是编号为 a 1 , a 2 , . . , a n a_1,a_2,..,a_n a1,a2,..,an )恰好都能拿到最初始持有的球。
经过观察对于一个长度为 n n n 序列 P = { p 1 , p 2 , p 3 . . . p n } P=\{p_1,p_2,p_3...p_n\} P={p1,p2,p3...pn} 的全错位排列的排法有 ( n − 1 ) ! (n-1)! (n1)!
对于一个任意的排列 P P P , S ( P ) S(P) S(P) P P P 中所有能组成全排列的集合的集合长度(大小)的最小公倍数。比如 排列 2 3 1 5 4 ,前三个数字组成了一个大小为 3 的全错位排列集合,后两个数字组成了大小为 2 的全错位排列集合。所以对于 P = { p 1 = 2 , p 2 = 3 , p 3 = 1 , p 4 = 5 , p 5 = 4 } P=\{p_1=2,p_2=3,p_3=1,p_4=5,p_5=4\} P={p1=2,p2=3,p3=1,p4=5,p5=4} , S ( P ) = l c m ( 2 , 3 ) = 6 S(P)=lcm(2,3)=6 S(P)=lcm(2,3)=6,所以我们现在可以求给出任意一个 P P P S ( P ) S(P) S(P)
定义 D P [ i ] [ j ] DP[i][j] DP[i][j] 为取长度为 i i i 操作次数为 j j j 的序列排列方法数。
考虑转移方法,在当前状态下,再取 x x x 个数组成全错位排列,那么就会到达 D P [ i + x ] [ l c m ( j , x ) ] DP[i+x][lcm(j,x)] DP[i+x][lcm(j,x)] 那么这两个状态之间存在怎样的数量关系呢?
首先,长度为 x x x 的全错位排列有 ( x − 1 ) ! (x-1)! (x1)! 种,而且,这 x x x 个数可以在对应的剩余数字 n − i n-i ni 个里面取。但是,每次再取 x x x 个数时,必须定一个数是必须要取的,不然会造成重复。比如 n = = 5 n==5 n==5 的情况下 D P [ 3 ] [ 2 ] DP[3][2] DP[3][2] 中 有一种排列方法 2 1 3 那么当 x = 2 x=2 x=2 这种方法可以变成 2 1 3 4 5,当 D P [ 2 ] [ 2 ] DP[2][2] DP[2][2] 中,有一种排列方法 2 1,如果不限定一个数为必取(比如 3)那么 x = 2 x=2 x=2 时,DP[4][2] 中会有 2 1 _ 5 4。此时这个方法最终也会变成 2 1 3 5 4,造成了重复。所以转移时,我们考虑当前一定有一个数一定在新增的 x x x 个数之内。
D P [ i + x ] [ l c m ( j , x ) ] + = ( D P [ i ] [ j ] ∗ C n − i − 1 x − i ∗ ( x − 1 ) ! ) DP[i+x][lcm(j,x)]+=(DP[i][j]*C_{n-i-1}^{x-i}*(x-1)!) DP[i+x][lcm(j,x)]+=(DP[i][j]Cni1xi(x1)!)
然后枚举所有的 i , j , x i,j,x i,j,x 就可以了,注意 m a x ( j ) = 200000 。 max(j)=200000。 max(j)=200000
官方题解 ||我的代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: atcoder beginner contest 226 是一个由 AtCoder 组织的初学者比赛,旨在为初学者提供一个锻炼自己编程能力的机会。比赛通常包括多个问题,难度从简单到困难不等,参赛者需要在规定时间内解决尽可能多的问题。该比赛吸引了来自世界各地的初学者参加,是一个非常有趣和有挑战性的比赛。 ### 回答2: AtCoder Beginner Contest 226 是日本AtCoder举办的一场新手比赛。这场比赛通常设有三到五个问题,题目难度逐渐增加,旨在让初学者锻炼编程技巧和算法思维。 比赛开始时,参赛选手需要在指定时间内独立解决各个问题。比赛网站提供了在线编程环境,选手可以使用C++、Python、Java等常见编程语言提交代码。解题的时间和代码正确性都会影响选手的得分。 题目的类型非常多样,通常涵盖了数据结构、图论、动态规划、贪心等算法知识点。选手可以从题目描述中获得输入输出的要求,并根据题意编写代码来解决问题。 在比赛过程中,选手需要尽快理解题目,并设计出正确的解决方案。正确的思路及合理的实现将是获得高分的关键。因此,参赛选手需要在比赛前充分复习算法知识、熟练掌握编程语言,并在实践中提高自己的编码能力。 ATCoder Beginner Contest 226 不仅考验了参赛选手的算法和编程水平,还对他们的应变能力和时间管理能力提出了要求。即使是经验丰富的选手,也需要在限定时间内思考问题、调试代码,尽量取得更好的成绩。 通过参加此类竞赛,选手可以提高自己的编程技能、拓宽解题思路,并加深对算法和数据结构的理解。同时,比赛过程中还可以与其他选手交流经验,提高团队合作和竞争意识。 总而言之,AtCoder Beginner Contest 226 是一场适合初学者的编程比赛,通过参与其中,选手可以提高自己的编程能力,拓宽算法思维,并享受竞赛的乐趣。 ### 回答3: AtCoder Beginner Contest 226是AtCoder举办的一场面向初学者的比赛。这场比赛通常由3到4道问题组成,涵盖了算法和编程的各个方面。 比赛开始时,参赛选手将在规定的时间内独立解答问题。每个问题都有不同的难度和分值,选手需要在限定时间内尽可能解决更多的问题,并在解答正确的情况下获得更高的得分。 比赛过程中,选手可以使用自己熟悉的编程语言,如C ++,Java或Python。他们需要运用算法和数据结构的知识,设计出高效的解决方案,并考虑到时间和空间的复杂度来优化代码。 此外,比赛还严格限制了提交次数和解答时间,这要求选手在思考和编码时要快速和准确。选手需要经常检查他们的代码是否符合问题的要求,并在必要时进行调试。 比赛结束后,AtCoder将根据选手的成绩排名,并授予他们相应的奖励。排在前几名的选手将获得奖牌,他们的成绩也将被列入AtCoder的排名榜。 总的来说,AtCoder Beginner Contest 226为初学者提供了一个锻炼算法和编程能力的机会。通过参加这样的比赛,选手可以提高他们的技能,并与其他热爱编程的人分享和交流。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值