第k个序列,简单数学题

ZZULI 1318 第k个序列

输入k后让k--,即把原本的(1,2,…n)视为第0个序列。
举例说明我的程序:
5 1
23
k--后为22
mark原本全为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 - - - 1
1 - - 1 1
1 1 - 1 1
1 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;
}

 

posted @ 2010-07-11 21:27  孟起  阅读(424)  评论(0编辑  收藏  举报