题目大意:
输入n k,1-n的排列,k次操作
操作P:输入一个m 输出第m个排列
操作Q:输入一个排列 输出它是第几个排列
Sample Input
5 2
P
3
Q
1 2 5 3 4
Sample Output
1 2 4 3 5
5
康拓展开裸题 然而因为用了getchar(); 所以一直在超时
康拓展开:http://www.cnblogs.com/dong008259/archive/2011/12/12/2283436.html
#include <bits/stdc++.h> using namespace std; int n,a[25],b[25]; long long int fac[25]={1,1,2,6,24,120,720,5040,40320,362880,3628800, 39916800,479001600,6227020800,87178291200,1307674368000,20922789888000, 355687428096000,6402373705728000,121645100408832000,2432902008176640000}; void ops0() { long long sum=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { int tem=0; for(int j=i+1;j<=n;j++) if(a[j]<a[i]) tem++; sum+=tem*fac[n-i]; } printf("%lld ",sum+1); } void ops1() { long long m; scanf("%lld",&m); m--; for(int i=n-1;i>=0;i--) { int tem=m/fac[i]; for(int j=0;j<=tem;j++) if(b[j]) tem++; if(i) printf("%d ",tem+1); else printf("%d",tem+1); b[tem]=1; m%=fac[i]; } printf(" "); } int main() { int k; while(~scanf("%d%d",&n,&k)) { while(k--) { memset(b,0,sizeof(b)); char ops; scanf(" %c",&ops); if(ops=='P') ops1(); else ops0(); } printf(" "); } return 0; }