c++全排列超时问题

问题遇到的现象和发生背景

全排列问题,请教如何修改?
问题是pta上 四个超时 两个正确。。
Lc今天上课学会了数的全排列并且Lc觉得数的全排列很简单,但是直到Lc的同桌YooQ向他提出了一个问题,该问题的描述如下:我们知道n的全排列总共有n!个序列,例如2的全排列有两个序列{1,2}和{2,1},现在你要解决的问题是n的全排列的n!个序列中第m个序列是什么?(注意:n的全排列的n!个序列是按字典序由小到大排序的)

输入格式:
第一行为样例组数t(t≤1e5),接下来t行每行有一个整数n和m(1<=n<=20,1<=m<=n!)

输出格式:
输出t行,每行输出n的全排列的n!个序列中第m个序列,两相邻的数间有一空格,行末不得有多余空格。

用代码块功能插入代码,请勿粘贴截图
#include 
using namespace std;
const int N=100;
int n,m,cnt;
int take[N];
bool st[N];
void dfs(int k){
    int i;
    if(k==n+1){
        cnt++;
        if(cnt==m){
            for(i=1;i" ";
            }
            cout<else{
        for(int j=1;j<=n;j++){
            if(st[j]==0){
                take[k]=j;
                st[j]=1;
                dfs(k+1);
                st[j]=0;
            }
        }
    }
}
int main(){
    int t;
    cin>>t;
    while(t--){
        cin>>n>>m;
        dfs(1);
        cnt=0;
        for(int i=0;i0;
            st[i]=0;
        }
        
    }
}