nyoj 139 我排第几个【数学】【康托展开】
2016-03-24 17:19
417 查看
我排第几个
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
输入第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出输出一个整数m,占一行,m表示排列是第几位;
样例输入
3 abcdefghijkl hgebkflacdji gfkedhjblcia
样例输出
1 302715242 260726926
康托展开
康托展开是一个双射,即不仅可以求是第几小,而且可以根据是第几小求出该排列.
Code:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #define INF 0x3f3f3f3f #define eps 1e-8 #define Si(a) scanf("%d", &a) #define Sl(a) scanf("%lld", &a) #define Sf(a) scanf("%lf", &a) #define Ss(a) scanf("%s", a) #define Pi(a) printf("%d\n", (a)) #define Pf(a) printf("%.2lf\n", (a)) #define Pl(a) printf("%lld\n", (a)) #define Ps(a) printf("%s\n", (a)) #define W(a) while((a)--) #define CLR(a, b) memset(a, (b), sizeof(a)) #define LL long long #define PI acos(-1.0) const int m = 12; int main() { int f[m+1]; f[0] = 1; for(int i = 1; i < m; ++i) { f[i] = f[i-1]*i; } char s[m+1]; int t; Si(t); W(t) { Ss(s); int len = strlen(s); LL ans = 0; for(int i = 0; i < len-1; ++i) { int sum = 0; for(int j = i+1; j <= len-1; ++j) { if(s[i] > s[j]) ++sum; } ans += sum * f[len-i-1]; } Pl(ans+1); } return 0; }
相关文章推荐
- centos6.2关于tomcat远程不能访问的问题处理过程
- 视图、索引、存储过程优缺点
- TextureImporterType 纹理导入类型
- shell 脚本 变量 获取程序输出结果异常分析
- 聊聊并发(五)原子操作的实现原理
- Facebook 2016 面试题1 | 递增三元组子序列
- 无聊的人是多么牛逼
- hdu2035java
- JQ之 offset 和 position 的用法与区别
- HashMap的实现
- java websocket
- SpringMVC学习系列-后记 解决GET请求时中文乱码的问题
- linux历史命令查找快捷方式
- ios开发环境搭建
- #ifdef __cplusplus extern "C"
- 求一维数组的最大子数组1(结对开发)
- AndroidStudio实用技能(2)
- JDK源码中使用的设计模式
- django debug toolbar jquery加载配置
- 淘宝开源项目TbSchedule的部署和使用