ZZULI 1318 第k个序列
输入k后让k--,即把原本的(1,2,…n)视为第0个序列。举例说明我的程序:5 123k--后为22mark原本全为0,- - - - - (mark从1到5原本都为0)22/4! =0 余22/3! =3 余4/2! =2 余0/1! =0 余0根据每次除得的结果t:0,3,2,0,0,对mark进行标记对t从前至后找到t个没标记的mark,将第t+1个标记1 - - - -1 - - - 11 - - 1 11 1 - 1 11 1 1 1 1输出结果为1 5 4 2 3
下面我们翻过来证明一下,1 5 4 2 3是n=5时的第22个序列(假定1 2 3 4 5是第0个)k= 0*4! +3*3! +2*2! +0*1! +0*0! = 22
代码 #include < stdio.h > #include < string .h > int main(){ int n,m,i,j,con; int mark[ 22 ]; __int64 jie[ 22 ],k,t; jie[ 1 ] = 1 ; for (i = 2 ;i <= 20 ;i ++ ) jie[i] = i * jie[i - 1 ]; while (scanf( " %d%d " , & n, & m) != EOF){ while (m -- ){ scanf( " %I64d " , & k); k -- ; memset(mark, 0 , sizeof (mark)); for (i = 1 ;i <= n;i ++ ) { t = k / jie[n - i]; con = 0 ; for (j = 1 ;j <= 20 ;j ++ ){ if (mark[j] == 0 ) con ++ ; if (con == t + 1 ){ printf( " %d " ,j); mark[j] = 1 ; break ; } } putchar(i == n ? ' \n ' : ' ' ); k %= jie[n - i]; } } } return 0 ;}
转载于:https://www.cnblogs.com/DreamUp/archive/2010/07/11/1775371.html
