【例题】【康托展开】NKOJ 2272 数字排列
来源:互联网 发布:12306自动抢票软件 编辑:程序博客网 时间:2024/05/16 10:25
NKOJ 2272【康托展开】数字排列
时间限制 : 20000 MS 空间限制 : 65536 KB
问题描述
{1,2,3} 三个数的全排列可看做6个数字,按从小到大排序得到序列a:123,132,213,231,312,321
下面有两种提问:
1.数字231在序列a中排名第几?回答4
2.数列a中排名第5的数字是多少?回答312
给出n个数字(1,2,3,…,n),回答关于序列a的1和2两种提问。
输入格式
第一行,两个整数n和m,n表示数字1到n(n<=9)构成的全排列,m(m<=100,000)表示询问数
接下来m行,表示询问,每行两个整数x和y,x=1表示第一种询问,回答y的排名;x=2表示第2种询问,答出排名为y的数字
输出格式
m行,每行一个整数,表示对应的答案。
样例输入
3 2
1 231
2 5
样例输出
4
312
注意:区分1~n、0~n、0不能再最前的情况
#include<cstdio>#include<iostream>using namespace std;const int need=11;int p[need],s[need];int n,m;int kt(){ int ans=0,cnt; for(int i=1;i<=n;i++) { cnt=0; for(int j=1;j<i;j++) if(s[j]<s[i]) cnt++; ans+=(s[i]-1-cnt)*p[n-i];//1~n 的排列,多减1,0~n,不减1 } return ans+1;}void nkt(int k)//k为排名 { bool mark[need]={0}; k--; for(int i=1,j,t;i<=n;i++) { t=k/p[n-i]; for(j=1;j<=n;j++) if(!mark[j]) { if(t==0) break; t--; } mark[j]=true; s[i]=j; k%=p[n-i]; }}int main(){ scanf("%d%d",&n,&m); p[0]=1; for(int i=1;i<=n;i++) p[i]=p[i-1]*i; char a; for(int i=1,a,b,tot;i<=m;i++) { tot=1; scanf("%d",&a); if(a==1) { while(true) { a=getchar(); if('0'<a&&a<='9') break; } s[1]=a-'0'; while(true) { a=getchar(); if(a<='0'||a>'9') break; s[++tot]=a-'0'; } printf("%d\n",kt()); } else { scanf("%d",&b); nkt(b); for(int i=1;i<=n;i++) putchar(s[i]+'0');putchar(10); } }}
0 0
- 【例题】【康托展开】NKOJ 2272 数字排列
- 康托展开 全排列
- 排列(康托展开)
- hdu 1027 康托展开求全排列
- 康托展开(方便排列计数)
- 全排列计算(康托展开)
- 排列序数(康托展开)
- 排列序列 (康托展开)
- HDU 1043 全排列 康托展开
- 全排列与 康托展开
- 康托展开与全排列
- vijos - P1092全排列 (康托展开 + 康托展开的逆运算)
- 康托展开(基于全排列的某一种hash)
- 关于全排列问题的总结(康托展开)
- 全排列方法二(康托展开)
- 2017蓝桥杯官方模拟题 排列序数(康托展开)
- 蓝桥模拟题 排列序数(康托展开)
- 2017 蓝桥模拟 排列序数 康托展开
- 面向对象的七大设计原则
- codeforces AIM Tech Round 3 (Div. 2) B. Checkpoints
- 在MAC中配置maven
- 配置pam_mysql 出错
- MySQL死锁问题实例分析及解决方法
- 【例题】【康托展开】NKOJ 2272 数字排列
- Java8遇到certificate does not confirm to algorithm constrains
- 带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑
- 最小二乘法公式
- [iOS XIB适配] xib 进行 多个按钮平均分布适配
- 用redis+php7改造ecshop单品商城支持日百万pv
- Java 变量和常量
- js数据容量单位转换方法
- 笔记:lucene学习