全排列
484ms,弱爆了。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<vector>
#include<map>
using namespace std;
int n,m,cnt,ans[1010];
bool vis[1010],flag;
void solve(int k){
int i;
if(cnt==m)
return;
if(k==n+1){
cnt++;
if(cnt==m)
flag=true;
}
else
for(i=1;i<=n;i++)
if(!vis[i]){
vis[i]=true;
if(!flag)
ans[k]=i;
solve(k+1);
vis[i]=false;
}
}
int main()
{
int i;
while(cin>>n>>m){
memset(vis,false,sizeof(vis));
cnt=0;
flag=false;
solve(1);
printf("%d",ans[1]);
for(i=2;i<=n;i++)
printf(" %d",ans[i]);
printf("\n");
}
return 0;
}
46ms改进版。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<vector>
#include<map>
using namespace std;
int n,m,cnt,ans[1010],base;
bool vis[1010],flag;
void solve(int k){
int i;
if(cnt==m)
return;
if(k==n+1){
cnt++;
if(cnt==m)
flag=true;
}
else
for(i=n-base;i<=n;i++)
if(!vis[i]){
vis[i]=true;
if(!flag)
ans[k]=i;
solve(k+1);
vis[i]=false;
}
}
int main()
{
int i,fac[10];
fac[0]=1;
for(i=1;i<10;i++)
fac[i]=fac[i-1]*i;
while(cin>>n>>m){
for(i=1;i<10;i++)
if(m>=fac[i])
base=i;
for(i=1;i<=n;i++)
ans[i]=i;
memset(vis,false,sizeof(vis));
cnt=0;
flag=false;
solve(n-base);
printf("%d",ans[1]);
for(i=2;i<=n;i++)
printf(" %d",ans[i]);
printf("\n");
}
return 0;
}