@[tang_mx](/user/515833) 这道题的思路有个坑,就是要求的并不是1..n这个序列的m+1号排列,而是原题目给出的序列的后m号排列
by LovelyTomato @ 2023-07-23 22:45:52
```cpp
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,m,a[10100],b[10100],cnt,flagg;
bool flag[10100];
void dfs(int x){
if(flagg)exit(0);
if(x==n+1){
cnt++;
if(cnt==m+1){
for(int j=1;j<=n;j++)
printf("%d ",a[j]);
flagg++;
}
return ;
}
for(int i=1;i<=n;i++){
if(!cnt)i=a[x];
if(!flag[i]){
flag[i]=1;
a[x]=i;
dfs(x+1);
flag[i]=0;
}
}
}
int main(){
// freopen("P1088_2.in","r",stdin);
// freopen("ans.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
dfs(1);
return 0;
}
```
@[tang_mx](/user/515833)
by LovelyTomato @ 2023-07-23 22:49:42
@[tang_mx](/user/515833) 代码其实很迷 看了半天(雾
by LovelyTomato @ 2023-07-23 22:50:12
@[LovelyTomato](/user/617088) 感谢!抱歉有一处很明显的错误我竟然没看出来QAQ
by tang_mx @ 2023-07-23 22:53:49
@[LovelyTomato](/user/617088) 其实我刚开始的代码问题不是很大的,但是做不出来看了眼题解就成了这种样子了QAQ
by tang_mx @ 2023-07-23 22:55:56
@[tang_mx](/user/515833) 其实STL有种很nt的做法
```
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ans[10001];
inline int read(){
int X=0,w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
inline void write(long long x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
signed main(){
n=read();
m=read();
for (int i=1;i<=n;i++) ans[i]=read();
for (int i=1;i<=m;i++) next_permutation(ans+1,ans+1+n);
for (int i=1;i<=n;i++) write(ans[i]),cout<<" ";
}
```
by LovelyTomato @ 2023-07-23 22:59:00
@[LovelyTomato](/user/617088) 我知道的,但我在尝试训练我的基础能力,所以暂时不用STLφ(゜▽゜*)♪
by tang_mx @ 2023-07-23 23:08:21
你这个STL还是太逊了啊,有个更快的做法
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,a[10005];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
next_permutation(a+1,a+n+1);
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
```
by JI_CI @ 2023-08-12 19:28:26