对于排列这种题,在下不才,推荐一个调用函数曰:next_permutation();即是生成下一个排列。但是哦,当排列的数目超过个位数的时候最好就不要再用了,会超时的。。。。。。。。。。。。。。。。。。。。。。。。。。。。
我排第几个
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
-
输入
-
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
- 输出一个整数m,占一行,m表示排列是第几位; 样例输入
-
3 abcdefghijkl hgebkflacdji gfkedhjblcia
样例输出
-
1 302715242 260726926
太水了,直接上代码:
#include<stdio.h> #include<algorithm> #include<math.h> #include<string.h> #include<stack> using namespace std; long long J_C(int n) { long long m=1; for(int i=2; i<=n; i++) { m*=i; } return m; } int main() { int T; scanf("%d%*c",&T); while(T--) { char s[13]; int n=12; for(int i=0; i<n; i++) scanf("%c",&s[i]); getchar(); long long num=0; int k=n-1; for(int i=0; i<n; i++) { int count=0; for(int j=i+1; j<n; j++) { if(s[j]<s[i]) count++; } num+=count*J_C(k); --k; } printf("%lld\n",num+1); } }
#include<stdio.h> #include<algorithm> #include<math.h> #include<string.h> #include<stdlib.h> using namespace std; int a[13]= {1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800}; int v[13]; int main() { int T; scanf("%d",&T); while(T--) { memset(v,0,sizeof(v)); long long n; scanf("%lld",&n); int k=12; n-=1; while(k) { int u=n/a[k-1]; n%=a[k-1]; int x=0,i; for(i=0; i<12; i++) { if(!v[i]) { if(x==u) { printf("%c",i+'a'); v[i]=1; break; } ++x; } } --k; } printf("\n"); } }
-
第一行有一个整数n(0<n<=10000);