2020.08.07【NOIP提高组】模拟:排列 总结
Description
一个关于nnn个元素的排列是指一个从{1,2,…,n}\{1, 2, …, n\}{1,2,…,n}到{1,2,…,n}\{1, 2, …, n\}{1,2,…,n}的一一映射的函数。这个排列ppp的秩是指最小的kkk,使得对于所有的i=1,2,…,ni = 1, 2, …, ni=1,2,…,n,都有p(p(…p(i)…))=ip(p(…p(i)…)) = ip(p(…p(i)…))=i(其中,ppp一共出现了kkk次)。
例如,对于一个三个元素的排列p(1)=3,p(2)=2,p(3)=1p(1) = 3, p(2) = 2, p(3) = 1p(1)=3,p(2)=2,p(3)=1,它的秩是222,因为p(p(1))=1,p(p(2))=2,p(p(3))=3p(p(1)) = 1, p(p(2)) = 2, p(p(3)) = 3p(p(1))=1,p(p(2))=2,p(p(3))=3。
给定一个nnn,我们希望从n!n!n!个排列中,找出一个拥有最大秩的排列。例如,对于n=5n=5n=5,它能达到最大秩为666,这个排列是p(1)=4,p(2)=5,p(3)=2,p(4)=1,p(5)=3p(1) = 4, p(2) = 5, p(3) = 2, p(4) = 1, p(5) = 3p(1)=4,p(2)=5,p(3)=2,p(4)=1,p(5)=3。
当我们有多个排列能得到这个最大的秩的时候,我们希望你求出字典序最小的那个排列。对于nnn个元素的排列,排列ppp的字典序比排列rrr小的意思是:存在一个整数iii,使得对于所有j<ij<ij<i,都有p(j)=r(j)p(j)=r(j)p(j)=r(j),同时p(i)<r(i)p(i) < r(i)p(i)<r(i)。对于555来说,秩最大而且字典序最小的排列为:p(1)=2,p(2)=1,p(3)=4,p(4)=5,p(5)=3p(1) = 2, p(2) = 1, p(3) = 4, p(4) = 5, p(5) = 3p(1)=2,p(2)=1,p(3)=4,p(4)=5,p(5)=3。
Input
输入的第一行是一个整数T(T<=10)T(T <= 10)T(T<=10),代表数据的个数。
每个数据只有一行,为一个整数NNN。
Output
对于每个NNN,输出秩最大且字典序最小的那个排列。即输出p(1),p(2),…,p(n)p(1), p(2),…,p(n)p(1),p(2),…,p(n)的值,用空格分隔。
Sample Input
2
5
14
Sample Output
2 1 4 5 3
2 3 1 5 6 7 4 9 10 11 12 13 14 8
Data Constraint
对于40%40\%40%的数据,有1≤N≤1001≤N≤1001≤N≤100。
对于所有的数据,有1≤N≤100001≤N≤100001≤N≤10000。
总结
比赛思路: 没有做。
正解: 我们先预处理出1−100001-100001−10000的素数集合aaa,aia_iai表示第iii个素数。然后可以发现这道题目是一道有限背包问题。设fi,jf_{i,j}fi,j表示选到第iii个和为jjj的最大秩,则fi,j=fi−1,j−aikf_{i,j}=f_{i-1,j-a_i^k}fi,j=fi−1,j−aik。每一次我们记录一下它是从哪个状态推来的,贪心还原即可。

本文探讨了NOIP提高组的一道排列模拟题,详细解释了如何寻找具有最大秩的排列,并通过字典序最小原则确定唯一解。文章介绍了题目的背景、输入输出格式、样例及数据约束,最后给出了比赛思路和正解方法。
751

被折叠的 条评论
为什么被折叠?



