1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
#include <cstdlib> #include <algorithm> #include <cstring> #include <cctype> #define INF 2000000000 using namespace std; typedef long long ll; int (){ int f=1,x=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();} while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); return f*x; } int n,m,a[40],vis[30]; ll fac[40]; void makep(){ ll x,t;int rk,j,k; scanf("%lld",&x); memset(vis,0,sizeof(vis)); for(int i=1;i<n;i++){ t=0; for(j=1;j<=n-i+1;j++){ if(x<=t+fac[n-i])break; t+=fac[n-i]; } x-=t,rk=0; for(k=1;k<=n;k++){ if(!vis[k])rk++; if(rk==j)break; } printf("%d ",k); vis[k]=1; } for(int i=1;i<=n;i++) if(!vis[i])printf("%dn",i); } ll query(){ ll ans=0;int rk,j,k; memset(vis,0,sizeof(vis)); for(int i=1;i<n;i++){ rk=0; for(k=1;k<a[i];k++) if(!vis[k])rk++; vis[a[i]]=1; ans+=(ll)rk*fac[n-i]; } return ans+1; } void init(){ n=read(),m=read(); fac[1]=fac[0]=1; for(int i=2;i<=20;i++)fac[i]=fac[i-1]*(ll)i; } void solve(){ char ord[3]; while(m--){ scanf("%s",ord); if(ord[0]=='P')makep(); else{ for(int i=1;i<=n;i++)a[i]=read(); printf("%lldn",query()); } } } int main(){ init(); solve(); return 0; }
|
近期评论