输出指定序列的前面第N个序列

来源:互联网 发布:金山数据恢复和 编辑:程序博客网 时间:2024/05/25 23:27

输入第一行两个数,第一个数表示序列有多少个元素,第二个数表示要输出这个序列前面的第K个。

第二行有N个数,表示序列。序列中只有从1到N工N个数

以0 0结束输入

代码如下:

/*样例输入 5 44 1 3 2 55 11 2 3 4 55 1195 4 3 2 10 0样例输出3 5 4 1 2-11 2 3 4 5*/#include<iostream>#include<cstdio>using namespace std;__int64 A(int n){if(n==0)return 1;__int64 ret=1;for(int i=2;i<=n;++i){ret*=i;}return ret;}int cnt[25];__int64 ori[25];int visit[25];int main(){freopen("data.txt","r",stdin);ios::sync_with_stdio(false);int n;__int64 k;while(cin>>n>>k){if(n==0&&k==0)break;__int64 pos=0;for(int i=1;i<=n;++i){cin>>ori[i];cnt[i]=i;}for(int i=1;i<=n;++i){int top=ori[i];pos+=(A(n-i)*(cnt[top]-1));for(int t=top;t<=n;++t){cnt[t]--;}}pos++;if(pos<=k){cout<<-1<<endl;continue;}///////////////////////////////////////////////////cout<<pos<<endl;pos-=k;//cout<<"pos="<<pos<<endl;memset(visit,0,sizeof(visit));//for(int i=1;i<=n;++i){//cnt[i]=i;//}for(int i=1;i<=n;++i){__int64 v=A(n-i);//cout<<"pos="<<pos<<' '<<"v="<<v<<"n,i "<<n<<' '<<i<<endl;__int64 tmp=pos/v;if(pos%v)tmp++;pos=pos-v*(tmp-1);int d=0;int dis;//cout<<"tmp="<<tmp<<endl;for(dis=1;dis<=n;++dis){if(!visit[dis])d++;if(d==tmp)break;}//cout<<"d="<<d<<' '<<"dis="<<dis<<endl;ori[i]=dis;visit[dis]=1;//for(int t=dis;t<=n;++t){//cnt[t]--;//}}for(int i=1;i<=n;++i){cout<<ori[i]<<' ';}cout<<endl;}return 0;}


0 0
原创粉丝点击