2020.08.07【NOIP提高组】模拟:排列 总结

2020.08.07【NOIP提高组】模拟:排列 总结

Description

一个关于 n n n个元素的排列是指一个从 { 1 , 2 , … , n } \{1, 2, …, n\} {1,2,,n} { 1 , 2 , … , n } \{1, 2, …, n\} {1,2,,n}的一一映射的函数。这个排列 p p p的秩是指最小的 k k k,使得对于所有的 i = 1 , 2 , … , n i = 1, 2, …, n i=1,2,,n,都有 p ( p ( … p ( i ) … ) ) = i p(p(…p(i)…)) = i p(p(p(i)))=i(其中, p p p一共出现了 k k k次)。
例如,对于一个三个元素的排列 p ( 1 ) = 3 , p ( 2 ) = 2 , p ( 3 ) = 1 p(1) = 3, p(2) = 2, p(3) = 1 p(1)=3,p(2)=2,p(3)=1,它的秩是 2 2 2,因为 p ( p ( 1 ) ) = 1 , p ( p ( 2 ) ) = 2 , p ( p ( 3 ) ) = 3 p(p(1)) = 1, p(p(2)) = 2, p(p(3)) = 3 p(p(1))=1,p(p(2))=2,p(p(3))=3
给定一个 n n n,我们希望从 n ! n! n!个排列中,找出一个拥有最大秩的排列。例如,对于 n = 5 n=5 n=5,它能达到最大秩为 6 6 6,这个排列是 p ( 1 ) = 4 , p ( 2 ) = 5 , p ( 3 ) = 2 , p ( 4 ) = 1 , p ( 5 ) = 3 p(1) = 4, p(2) = 5, p(3) = 2, p(4) = 1, p(5) = 3 p(1)=4,p(2)=5,p(3)=2,p(4)=1,p(5)=3
当我们有多个排列能得到这个最大的秩的时候,我们希望你求出字典序最小的那个排列。对于 n n n个元素的排列,排列 p p p的字典序比排列 r r r小的意思是:存在一个整数 i i i,使得对于所有 j < i jj<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)。对于 5 5 5来说,秩最大而且字典序最小的排列为: p ( 1 ) = 2 , p ( 2 ) = 1 , p ( 3 ) = 4 , p ( 4 ) = 5 , p ( 5 ) = 3 p(1) = 2, p(2) = 1, p(3) = 4, p(4) = 5, p(5) = 3 p(1)=2,p(2)=1,p(3)=4,p(4)=5,p(5)=3

Input

输入的第一行是一个整数 T ( T < = 10 ) T(T <= 10) T(T<=10),代表数据的个数。
每个数据只有一行,为一个整数 N N N

Output

对于每个 N N N,输出秩最大且字典序最小的那个排列。即输出 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 ≤ 100 1≤N≤100 1N100
对于所有的数据,有 1 ≤ N ≤ 10000 1≤N≤10000 1N10000

总结

比赛思路: 没有做。
正解: 我们先预处理出 1 − 10000 1-10000 110000的素数集合 a a a a i a_i ai表示第 i i i个素数。然后可以发现这道题目是一道有限背包问题。设 f i , j f_{i,j} fi,j表示选到第 i i i个和为 j j j的最大秩,则 f i , j = f i − 1 , j − a i k f_{i,j}=f_{i-1,j-a_i^k} fi,j=fi1,jaik。每一次我们记录一下它是从哪个状态推来的,贪心还原即可。

你可能感兴趣的:(题解,动态规划,数学)