侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

【题解】【上海】【排列排序】

Allen Best
2023-08-01 / 0 评论 / 0 点赞 / 73 阅读 / 591 字
温馨提示:
本文最后更新于 2023-08-01,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
#include <bits/stdc++.h>
using namespace std;
long long k;
long long jc[105];
bool b[55];//标志该数是否被使用
int w;//答案是几个数字的全排列
void myprint(long long s,int step){//搜索
if (step==0) return;//所有数字完成,返回
long long x=(s-1)/jc[step-1]+1;//首位是第几个数字
for (int i=1;i<=w;i++){
if (b[i]==0){//没用过
x--;
if (x==0){
printf("%d ",i);//打印
b[i]=1;//标记已使用
break;
}
}
}
s%=jc[step-1];
if (s==0) s=jc[step-1];
myprint(s,step-1);
}
int main() {
cin>>k;
jc[0]=1;
long long sum=0;
for (int i=1;sum<=k;i++){
jc[i]=jc[i-1]*i;//求i的阶乘
sum+=jc[i];//求前i个数字组成的全排列一共多少个
w=i;//求出w
}
for (int i=1;i<w;i++){
k-=jc[i];//求出答案在w个数字组成的全排列中的序号
}
myprint(k,w);//搜索打印
return 0;
}

0

评论区