hdu1027

来源:互联网 发布:西门子plc编程入门 编辑:程序博客网 时间:2024/06/05 06:34
/*
分析:
    嘿嘿,我这代码在提交的里面排名还是挺不错的嘛O(∩_∩)O~
说下我的思路吧:
   “temp=1;while(temp*jie[n-key-1]+base_t<m;temp++);”得出
的temp所代表的从小到大第几个没有被使用的数,就是当前位置ans
中应该填上的数。
   其中jie[x]是x的阶乘;base_t是ans中前面已经确定的数的尾巴
的数量,eg:n=6的时候,当前三个数确定为1,2,3,那么后面可以有
jie[3]中排列情况;key代表已经得到前“几”个数了。
   每确定一个ans[i]后,base_t要+=(temp-1)*jie[n-key-1]。所以
毫无疑问的,当ans填满后,base_t是==m滴。


                                                     2012-05-23
*/








#include"stdio.h"#include"string.h"int main(){int n,m;int key,ans[1011];int jie[10];int i,l;int temp,up;int base,base_t;int hash[10];///jiejie[0]=1;jie[1]=1;for(i=2;i<10;i++)jie[i]=i*jie[i-1];while(scanf("%d%d",&n,&m)!=-1){memset(hash,0,sizeof(hash));            //注意:hash从0开始用,base和其照应base=1;key=0;///筛/*****/if(n>=9){i=1;while(n-key>=9)ans[key++]=i++;base=i;}/*****/up=n-key;base_t=0;                               //这个base_t和m照应while(key<n){for(temp=1;temp*jie[n-key-1]+base_t<m;temp++);for(i=0,l=1;i<up;i++,l++){if(hash[i])l--;if(l==temp)break;}base_t+=(temp-1)*jie[n-key-1];ans[key++]=i+base;hash[i]=1;}for(i=0;i<n-1;i++)printf("%d ",ans[i]);printf("%d\n",ans[i]);}return 0;}